Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
0b977cf
Adding number control By Kartik
DzilJalal Aug 15, 2020
bc16f89
Refactor Kartik Number: Bad Practice By Me
DzilJalal Aug 15, 2020
4c24ee6
Refactor Minify JS
DzilJalal Aug 15, 2020
54d71b2
Fix Select2
DzilJalal Aug 26, 2020
2af7ae4
Regenerated minify js
DzilJalal Oct 3, 2020
429340f
Mnify Js; Select 2 keep spinning
DzilJalal Oct 3, 2020
49d7737
Master to dev dzil tahap 1
DzilJalal Oct 3, 2020
97edbf8
Master to dev dzil tahap 2
DzilJalal Oct 3, 2020
f20e392
Master to dev dzil tahap 3
DzilJalal Oct 3, 2020
44ae50e
Di lokal malah bisa
DzilJalal Oct 3, 2020
c3d940f
Di lokal malah bisa, coba minify
DzilJalal Oct 3, 2020
3cd44e9
Di lokal malah bisa, coba minify ke 2
DzilJalal Oct 3, 2020
f9f0a90
Di lokal malah bisa, coba minify ke 3
DzilJalal Oct 3, 2020
1f42a92
Bug jika bukan di ajax call
DzilJalal Oct 20, 2020
4a41774
Bug jika bukan di ajax call 2
DzilJalal Oct 20, 2020
fe017e6
Remove duplicate code
DzilJalal Oct 21, 2020
a328ec1
Added jui datepicker
DzilJalal Oct 22, 2020
62ce0da
Fix datepicker
DzilJalal Oct 31, 2020
1e39d61
Bug crud non ajax
DzilJalal Jun 17, 2021
c397a68
Remove datepicker JUI
DzilJalal Oct 11, 2021
a0102eb
Revert
DzilJalal Oct 12, 2021
727947a
Revert Back
DzilJalal Oct 12, 2021
1ca337a
Update composer.json
ahmadfadlydziljalal Sep 12, 2022
3483d34
Update yii2-dynamic-form.js
ahmadfadlydziljalal Mar 14, 2024
1c50f81
Update yii2-dynamic-form.min.js
ahmadfadlydziljalal Mar 14, 2024
6d1e277
Chore: Update yii2-dynamic-form.js
ahmadfadlydziljalal Mar 14, 2024
453ac4e
Update yii2-dynamic-form.min.js
ahmadfadlydziljalal Mar 18, 2024
d49a80b
Update yii2-dynamic-form.js
ahmadfadlydziljalal Nov 8, 2024
3ddb01d
Update yii2-dynamic-form.min.js
ahmadfadlydziljalal Nov 8, 2024
6167612
Update DynamicFormWidget.php
ahmadfadlydziljalal Feb 1, 2025
4d778f2
Update DynamicFormWidget.php
ahmadfadlydziljalal Feb 3, 2025
ef0fce7
Support kvDatepicker
ahmadfadlydziljalal Sep 9, 2025
daac7a2
Support datecontrol for date input
ahmadfadlydziljalal Sep 10, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"widget",
"yii2-dynamicform",
"copy DOM element",
"yii2 dynamic form"
"yii2 dynamic form",
"Dev Dev Dzil"
],
"type": "yii2-extension",
"license": "BSD-3-Clause",
Expand All @@ -26,8 +27,8 @@
],
"require": {
"yiisoft/yii2": "~2.0.5",
"symfony/css-selector": "~2.8|~3.0",
"symfony/dom-crawler": "~2.8|~3.0"
"symfony/css-selector": "*",
"symfony/dom-crawler": "*"
},
"autoload": {
"psr-4": {
Expand Down
21 changes: 19 additions & 2 deletions src/DynamicFormWidget.php
Original file line number Diff line number Diff line change
Expand Up @@ -234,9 +234,26 @@ public function run()
$this->_options['template'] = trim($document->saveHTML());

if (isset($this->_options['min']) && $this->_options['min'] === 0 && $this->model->isNewRecord) {
$content = $this->removeItems($content);
}

/**
* This is will be handle for ajax request,
* if all attribute from formFields at least one attribute is not emtpy,
* prevent the html element to be removed.
*/
$isRemovedItems = true;
foreach ($this->formFields as $field) {
if(!empty($this->model->{$field})) {
$isRemovedItems = false;
break;
}
}

if($isRemovedItems){
$content = $this->removeItems($content);
}

}

$this->hashOptions();
$view = $this->getView();
$widgetRegistered = $this->registerHashVarWidget();
Expand Down
184 changes: 105 additions & 79 deletions src/assets/yii2-dynamic-form.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,30 +66,18 @@
});

$template.find('input, textarea, select').each(function() {
if ($(this).is(':checkbox') || $(this).is(':radio')) {
var type = ($(this).is(':checkbox')) ? 'checkbox' : 'radio';
var inputName = $(this).attr('name');
var $inputHidden = $template.find('input[type="hidden"][name="' + inputName + '"]').first();
var count = $template.find('input[type="' + type +'"][name="' + inputName + '"]').length;

if ($inputHidden && count === 1) {
$(this).val(1);
$inputHidden.val(0);
}
$(this).val('');
});

$(this).prop('checked', false);
} else if($(this).is('select')) {
$(this).find('option:selected').removeAttr("selected");
} else {
$(this).val('');
$template.find('input[type="checkbox"], input[type="radio"]').each(function() {
var inputName = $(this).attr('name');
var $inputHidden = $template.find('input[type="hidden"][name="' + inputName + '"]').first();
if ($inputHidden) {
$(this).val(1);
$inputHidden.val(0);
}
});

// remove "error/success" css class
var yiiActiveFormData = $('#' + widgetOptions.formId).yiiActiveForm('data');
$template.find('.' + yiiActiveFormData.settings.errorCssClass).removeClass(yiiActiveFormData.settings.errorCssClass);
$template.find('.' + yiiActiveFormData.settings.successCssClass).removeClass(yiiActiveFormData.settings.successCssClass);

return $template;
};

Expand All @@ -115,7 +103,7 @@
var count = _count($elem, widgetOptions);

if (count < widgetOptions.limit) {
$toclone = $(widgetOptions.template);
$toclone = widgetOptions.template;
$newclone = $toclone.clone(false, false);

if (widgetOptions.insertPosition === 'top') {
Expand Down Expand Up @@ -318,36 +306,10 @@
});
};

var _restoreKrajeeDepdrop = function($elem) {
var configDepdrop = $.extend(true, {}, eval($elem.attr('data-krajee-depdrop')));
var inputID = $elem.attr('id');
var matchID = inputID.match(regexID);

if (matchID && matchID.length === 4) {
for (index = 0; index < configDepdrop.depends.length; ++index) {
var match = configDepdrop.depends[index].match(regexID);
if (match && match.length === 4) {
configDepdrop.depends[index] = match[1] + matchID[2] + match[3];
}
}
}

$elem.depdrop(configDepdrop);
};

var _restoreSpecialJs = function(widgetOptions) {
var widgetOptionsRoot = _getWidgetOptionsRoot(widgetOptions);

// "jquery.inputmask"
var $hasInputmask = $(widgetOptionsRoot.widgetItem).find('[data-plugin-inputmask]');
if ($hasInputmask.length > 0) {
$hasInputmask.each(function() {
$(this).inputmask('remove');
$(this).inputmask(eval($(this).attr('data-plugin-inputmask')));
});
}

// "kartik-v/yii2-widget-datepicker"
// "kartik-v/yii2-widget-datepicker" yang lama
var $hasDatepicker = $(widgetOptionsRoot.widgetItem).find('[data-krajee-datepicker]');
if ($hasDatepicker.length > 0) {
$hasDatepicker.each(function() {
Expand All @@ -356,6 +318,75 @@
});
}

// "kartik-v/yii2-widget-datepicker" yang baru
var $hasKvDatepicker = $(widgetOptionsRoot.widgetItem).find('[data-krajee-kvdatepicker]');
if ($hasKvDatepicker.length) {
$hasKvDatepicker.each(function() {
var $input = $(this);

// ambil config asli dari attribute, kalau ada
var config = $input.attr('data-krajee-kvdatepicker');
var options = {};
if (config) {
try {
options = eval(config); // parse opsi asli dari PHP
} catch (e) {
console.warn('kvDatepicker config parse error', e);
}
}

// kalau masih kosong → fallback ke default
if ($.isEmptyObject(options)) {
options = {
format: 'dd-mm-yyyy',
autoclose: true,
todayHighlight: true,
todayBtn: true
};
}

// hapus binding lama supaya tidak tabrakan
$input.removeData('kvDatepicker');
$input.removeAttr('data-krajee-kvdatepicker');

// re-init kvDatepicker
$input.kvDatepicker(options);

// ==== tambahan: sinkronisasi ke hidden input DateControl ====
var $hiddenInput = $input.parent().next();
if ($hiddenInput.hasClass('datecontrol-save-options')) {
// helper manual kalau ev.format tidak ada
var formatDateManual = function(d) {
const yyyy = d.getFullYear();
const mm = String(d.getMonth() + 1).padStart(2, "0");
const dd = String(d.getDate()).padStart(2, "0");
return yyyy + "-" + mm + "-" + dd;
};

// pastikan tidak bind ganda
$input.off("changeDate._dynform clearDate._dynform");

// event pilih tanggal
$input.on("changeDate._dynform", function(ev) {
if (ev.date) {
var formatted = ev.format
? ev.format("yyyy-mm-dd")
: formatDateManual(ev.date);
$hiddenInput.val(formatted).trigger("change");
} else {
$hiddenInput.val("").trigger("change");
}
});

// event clear
$input.on("clearDate._dynform", function() {
$hiddenInput.val("").trigger("change");
});
}
});
}


// "kartik-v/yii2-widget-timepicker"
var $hasTimepicker = $(widgetOptionsRoot.widgetItem).find('[data-krajee-timepicker]');
if ($hasTimepicker.length > 0) {
Expand Down Expand Up @@ -428,11 +459,20 @@
var $hasDepdrop = $(widgetOptionsRoot.widgetItem).find('[data-krajee-depdrop]');
if ($hasDepdrop.length > 0) {
$hasDepdrop.each(function() {
if ($(this).data('select2') === undefined) {
$(this).removeData().off();
$(this).unbind();
_restoreKrajeeDepdrop($(this));
$(this).removeData().off();
$(this).unbind();
var configDepdrop = eval($(this).attr('data-krajee-depdrop'));
var inputID = $(this).attr('id');
var matchID = inputID.match(regex);
if (matchID && matchID.length === 4) {
for (index = 0; index < configDepdrop.depends.length; ++index) {
var match = configDepdrop.depends[index].match(regex);
if (match && match.length === 4) {
configDepdrop.depends[index] = match[1] + matchID[2] + match[3];
}
}
}
$(this).depdrop(configDepdrop);
});
}

Expand All @@ -442,34 +482,20 @@
$hasSelect2.each(function() {
var id = $(this).attr('id');
var configSelect2 = eval($(this).attr('data-krajee-select2'));

if ($(this).data('select2')) {
$(this).select2('destroy');
}

var configDepdrop = $(this).data('depdrop');
if (configDepdrop) {
configDepdrop = $.extend(true, {}, configDepdrop);
$(this).removeData().off();
$(this).unbind();
_restoreKrajeeDepdrop($(this));
}

$.when($('#' + id).select2(configSelect2)).done(initSelect2Loading(id, '.select2-container--krajee'));

var kvClose = 'kv_close_' + id.replace(/\-/g, '_');

$('#' + id).on('select2:opening', function(ev) {
initSelect2DropStyle(id, kvClose, ev);
$(this).select2('destroy');
$.when($('#' + id).select2(configSelect2)).done(initSelect2Loading(id));
$('#' + id).on('select2-open', function() {
initSelect2DropStyle(id)
});

$('#' + id).on('select2:unselect', function() {
window[kvClose] = true;
});

if (configDepdrop) {
var loadingText = (configDepdrop.loadingText) ? configDepdrop.loadingText : 'Loading ...';
initDepdropS2(id, loadingText);
if ($(this).attr('data-krajee-depdrop')) {
$(this).on('depdrop.beforeChange', function(e,i,v) {
var configDepdrop = eval($(this).attr('data-krajee-depdrop'));
var loadingText = (configDepdrop.loadingText)? configDepdrop.loadingText : 'Loading ...';
$('#' + id).select2('data', {text: loadingText});
});
$(this).on('depdrop.change', function(e,i,v,c) {
$('#' + id).select2('val', $('#' + id).val());
});
}
});
}
Expand Down
Loading