es-num lines-num-new">
-        <input type='text' name='idCard' class='form-control' placeholder='หมายเลขบัตรประชาชน' required />
15
-        <br>
14
+        <!-- 
15
+        <input type='text' name='idCard' class='form-control' placeholder='หมายเลขบัตรประชาชน' required /> 
16
+        <br> -->
17
+        <label>วันเกิด</label>
16 18
         <input type='date' name='bd' class='form-control' placeholder='วันเกิด' required />
17 19
         <br>
18 20
         <textarea name='address' class='form-control' placeholder='ที่อยู่' required></textarea>  
@@ -24,7 +26,7 @@
24 26
         <input type='text' name='line_id' class='form-control' placeholder='Line ID'/>
25 27
         <br>
26 28
         <label>อัพโหลดภาพ</label>
27
-        <input type="file" name='photo' accept="image/*;capture=camera" class='form-control' required> </br>
29
+        <input type="file" name='photo' accept="image/*;capture=camera" class='form-control'> </br>
28 30
         <span class="glyphicon glyphicon-map-marker"></span>
29 31
         <a class='btn btn-primary form-control' id="currentLocationBtn">
30 32
         <i class="bi bi-geo-alt-fill"></i>

+ 6 - 1
app/front/views.py

@@ -10,7 +10,7 @@ def index(request):
10 10
         p = Patient()
11 11
         p.first_name = request.POST.get('firstName')
12 12
         p.last_name = request.POST.get('lastName')
13
-        p.idcard = request.POST.get('idCard')
13
+        #p.idcard = request.POST.get('idCard')
14 14
         p.address = request.POST.get('address')
15 15
         p.geolocation = request.POST.get('geo')
16 16
         p.birth_date = request.POST.get('bd')
@@ -25,3 +25,8 @@ def index(request):
25 25
 
26 26
 def success(request):
27 27
     return render(request, 'front/success.html')
28
+
29
+def my404(request,exception):
30
+    return render(request, 'front/404.html')
31
+    #return redirect("index")
32
+

BIN
app/shaqfindbed/__pycache__/settings.cpython-39.pyc


BIN
app/shaqfindbed/__pycache__/urls.cpython-39.pyc


+ 1 - 1
app/shaqfindbed/settings.py

@@ -25,7 +25,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent
25 25
 SECRET_KEY = 'django-insecure-!=!d6rsewcddw=hr-j46#))^nd-32(kkjmnpxxioi(v&c9!*xn'
26 26
 
27 27
 # SECURITY WARNING: don't run with debug turned on in production!
28
-DEBUG = True
28
+DEBUG = False
29 29
 
30 30
 ALLOWED_HOSTS = [
31 31
     "167.71.218.44",

+ 5 - 0
app/shaqfindbed/urls.py

@@ -18,13 +18,18 @@ from django.urls import path, include
18 18
 from django.conf import settings
19 19
 from django.conf.urls import url
20 20
 from django.conf.urls.static import static
21
+from django.views.static import serve
22
+
21 23
 
22 24
 urlpatterns = [
23 25
     path('', include('front.urls')),
24 26
     path('backend/', include('backend.urls')),
25 27
     path('admin/', admin.site.urls),
26 28
     url(r'^chaining/', include('smart_selects.urls')),
29
+    url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
27 30
 ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
28 31
 
32
+
29 33
 if settings.DEBUG:
30 34
     urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
35
+handler404 = 'front.views.my404'

+ 162 - 0
app/staticfile/autocomplete_light/autocomplete.init.js

@@ -0,0 +1,162 @@
1
+/*
2
+This script garantees that this will be called once in django admin.
3
+However, its the callback's responsability to clean up if the
4
+element was cloned with data - which should be the case.
5
+*/
6
+
7
+;(function ($) {
8
+    $.fn.getFormPrefix = function() {
9
+        /* Get the form prefix for a field.
10
+         *
11
+         * For example:
12
+         *
13
+         *     $(':input[name$=owner]').getFormsetPrefix()
14
+         *
15
+         * Would return an empty string for an input with name 'owner' but would return
16
+         * 'inline_model-0-' for an input named 'inline_model-0-owner'.
17
+         */
18
+        var parts = $(this).attr('name').split('-');
19
+        var prefix = '';
20
+
21
+        for (var i in parts) {
22
+            var testPrefix = parts.slice(0, -i).join('-');
23
+            if (! testPrefix.length) continue;
24
+            testPrefix += '-';
25
+
26
+            var result = $(':input[name^=' + testPrefix + ']')
27
+
28
+            if (result.length) {
29
+                return testPrefix;
30
+            }
31
+        }
32
+
33
+        return '';
34
+    }
35
+
36
+    $.fn.getFormPrefixes = function() {
37
+        /*
38
+         * Get the form prefixes for a field, from the most specific to the least.
39
+         *
40
+         * For example:
41
+         *
42
+         *      $(':input[name$=owner]').getFormPrefixes()
43
+         *
44
+         * Would return:
45
+         * - [''] for an input named 'owner'.
46
+         * - ['inline_model-0-', ''] for an input named 'inline_model-0-owner' (i.e. nested with a nested inline).
47
+         * - ['sections-0-items-0-', 'sections-0-', ''] for an input named 'sections-0-items-0-product'
48
+         *   (i.e. nested multiple time with django-nested-admin).
49
+         */
50
+        var parts = $(this).attr('name').split('-').slice(0, -1);
51
+        var prefixes = [];
52
+
53
+        for (i = 0; i < parts.length; i += 2) {
54
+            var testPrefix = parts.slice(0, -i || parts.length).join('-');
55
+            if (!testPrefix.length)
56
+                continue;
57
+
58
+            testPrefix += '-';
59
+
60
+            var result = $(':input[name^=' + testPrefix + ']')
61
+
62
+            if (result.length)
63
+                prefixes.push(testPrefix);
64
+        }
65
+
66
+        prefixes.push('');
67
+
68
+        return prefixes;
69
+    }
70
+
71
+    var initialized = [];
72
+
73
+    function initialize(element) {
74
+        if (typeof element === 'undefined' || typeof element === 'number') {
75
+            element = this;
76
+        }
77
+
78
+        if (window.__dal__initListenerIsSet !== true || initialized.indexOf(element) >= 0) {
79
+            return;
80
+        }
81
+
82
+        $(element).trigger('autocompleteLightInitialize');
83
+        initialized.push(element);
84
+    }
85
+
86
+    if (!window.__dal__initialize) {
87
+        window.__dal__initialize = initialize;
88
+
89
+        $(document).ready(function () {
90
+            $('[data-autocomplete-light-function=select2]:not([id*="__prefix__"])').each(initialize);
91
+        });
92
+
93
+        $(document).bind('DOMNodeInserted', function (e) {
94
+            $(e.target).find('[data-autocomplete-light-function=select2]').each(initialize);
95
+        });
96
+    }
97
+
98
+    // using jQuery
99
+    function getCookie(name) {
100
+        var cookieValue = null;
101
+        if (document.cookie && document.cookie != '') {
102
+            var cookies = document.cookie.split(';');
103
+            for (var i = 0; i < cookies.length; i++) {
104
+                var cookie = $.trim(cookies[i]);
105
+                // Does this cookie string begin with the name we want?
106
+                if (cookie.substring(0, name.length + 1) == (name + '=')) {
107
+                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
108
+                    break;
109
+                }
110
+            }
111
+        }
112
+        return cookieValue;
113
+    }
114
+
115
+    document.csrftoken = getCookie('csrftoken');
116
+    if (document.csrftoken === null) {
117
+        // Try to get CSRF token from DOM when cookie is missing
118
+        var $csrf = $('form :input[name="csrfmiddlewaretoken"]');
119
+        if ($csrf.length > 0) {
120
+            document.csrftoken = $csrf[0].value;
121
+        }
122
+    }
123
+})(yl.jQuery);
124
+
125
+// Does the same thing as django's admin/js/autocomplete.js, but uses yl.jQuery.
126
+(function($) {
127
+    'use strict';
128
+    var init = function($element, options) {
129
+        var settings = $.extend({
130
+            ajax: {
131
+                data: function(params) {
132
+                    return {
133
+                        term: params.term,
134
+                        page: params.page
135
+                    };
136
+                }
137
+            }
138
+        }, options);
139
+        $element.select2(settings);
140
+    };
141
+
142
+    $.fn.djangoAdminSelect2 = function(options) {
143
+        var settings = $.extend({}, options);
144
+        $.each(this, function(i, element) {
145
+            var $element = $(element);
146
+            init($element, settings);
147
+        });
148
+        return this;
149
+    };
150
+
151
+    $(function() {
152
+        // Initialize all autocomplete widgets except the one in the template
153
+        // form used when a new formset is added.
154
+        $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2();
155
+    });
156
+
157
+    $(document).on('formset:added', (function() {
158
+        return function(event, $newFormset) {
159
+            return $newFormset.find('.admin-autocomplete').djangoAdminSelect2();
160
+        };
161
+    })(this));
162
+}(yl.jQuery));

+ 191 - 0
app/staticfile/autocomplete_light/forward.js

@@ -0,0 +1,191 @@
1
+;(function($, yl) {
2
+    yl.forwardHandlerRegistry = yl.forwardHandlerRegistry || {};
3
+
4
+    yl.registerForwardHandler = function(name, handler) {
5
+        yl.forwardHandlerRegistry[name] = handler;
6
+    };
7
+
8
+    yl.getForwardHandler = function(name) {
9
+        return yl.forwardHandlerRegistry[name];
10
+    };
11
+
12
+    function getForwardStrategy(element) {
13
+        var checkForCheckboxes = function() {
14
+            var all = true;
15
+            $.each(element, function(ix, e) {
16
+                if ($(e).attr("type") !== "checkbox") {
17
+                    all = false;
18
+                }
19
+            });
20
+            return all;
21
+        };
22
+
23
+        if (element.length === 1 &&
24
+                element.attr("type") === "checkbox" &&
25
+                element.attr("value") === undefined) {
26
+            // Single checkbox without 'value' attribute
27
+            // Boolean field
28
+            return "exists";
29
+        } else if (element.length === 1 &&
30
+                element.attr("multiple") !== undefined) {
31
+            // Multiple by HTML semantics. E. g. multiple select
32
+            // Multiple choice field
33
+            return "multiple";
34
+        } else if (checkForCheckboxes()) {
35
+            // Multiple checkboxes or one checkbox with 'value' attribute.
36
+            // Multiple choice field represented by checkboxes
37
+            return "multiple";
38
+        } else {
39
+            // Other cases
40
+            return "single";
41
+        }
42
+    }
43
+
44
+    /**
45
+     * Get fields with name `name` relative to `element` with considering form
46
+     * prefixes.
47
+     * @param element the element
48
+     * @param name name of the field
49
+     * @returns jQuery object with found fields or empty jQuery object if no
50
+     * field was found
51
+     */
52
+    yl.getFieldRelativeTo = function(element, name) {
53
+        var prefixes = $(element).getFormPrefixes();
54
+
55
+        for (var i = 0; i < prefixes.length; i++) {
56
+            var fieldSelector = "[name=" + prefixes[i] + name + "]";
57
+            var field = $(fieldSelector);
58
+
59
+            if (field.length) {
60
+                return field;
61
+            }
62
+        }
63
+
64
+        return $();
65
+    };
66
+
67
+    /**
68
+     * Get field value which is put to forwarded dictionary
69
+     * @param field the field
70
+     * @returns forwarded value
71
+     */
72
+    yl.getValueFromField = function(field) {
73
+        var strategy = getForwardStrategy(field);
74
+        var serializedField = $(field).serializeArray();
75
+
76
+        if ((serializedField == false) && ($(field).prop('disabled'))) {
77
+            $(field).prop('disabled', false);
78
+            serializedField = $(field).serializeArray();
79
+            $(field).prop('disabled', true);
80
+        }
81
+
82
+        var getSerializedFieldElementAt = function (index) {
83
+            // Return serializedField[index]
84
+            // or null if something went wrong
85
+            if (serializedField.length > index) {
86
+                return serializedField[index];
87
+            } else {
88
+                return null;
89
+            }
90
+        };
91
+
92
+        var getValueOf = function (elem) {
93
+            // Return elem.value
94
+            // or null if something went wrong
95
+            if (elem.hasOwnProperty("value") &&
96
+                elem.value !== undefined
97
+            ) {
98
+                return elem.value;
99
+            } else {
100
+                return null;
101
+            }
102
+        };
103
+
104
+        var getSerializedFieldValueAt = function (index) {
105
+            // Return serializedField[index].value
106
+            // or null if something went wrong
107
+            var elem = getSerializedFieldElementAt(index);
108
+            if (elem !== null) {
109
+                return getValueOf(elem);
110
+            } else {
111
+                return null;
112
+            }
113
+        };
114
+
115
+        if (strategy === "multiple") {
116
+            return serializedField.map(
117
+                function (item) {
118
+                    return getValueOf(item);
119
+                }
120
+            );
121
+        } else if (strategy === "exists") {
122
+            return serializedField.length > 0;
123
+        } else {
124
+            return getSerializedFieldValueAt(0);
125
+        }
126
+    };
127
+
128
+    yl.getForwards = function(element) {
129
+        var forwardElem,
130
+            forwardList,
131
+            forwardedData,
132
+            divSelector,
133
+            form;
134
+        divSelector = "div.dal-forward-conf#dal-forward-conf-for-" +
135
+                element.attr("id") + ", " +
136
+                "div.dal-forward-conf#dal-forward-conf-for_" +
137
+                element.attr("id");
138
+        form = element.length > 0 ? $(element[0].form) : $();
139
+
140
+        forwardElem =
141
+            form.find(divSelector).find('script');
142
+        if (forwardElem.length === 0) {
143
+            return;
144
+        }
145
+        try {
146
+            forwardList = JSON.parse(forwardElem.text());
147
+        } catch (e) {
148
+            return;
149
+        }
150
+
151
+        if (!Array.isArray(forwardList)) {
152
+            return;
153
+        }
154
+
155
+        forwardedData = {};
156
+
157
+        $.each(forwardList, function(ix, field) {
158
+            var srcName, dstName;
159
+            if (field.type === "const") {
160
+                forwardedData[field.dst] = field.val;
161
+            } else if (field.type === "self") {
162
+                if (field.hasOwnProperty("dst")) {
163
+                    dstName = field.dst;
164
+                } else {
165
+                    dstName = "self";
166
+                }
167
+                forwardedData[dstName] = yl.getValueFromField(element);
168
+            } else if (field.type === "field") {
169
+                srcName = field.src;
170
+                if (field.hasOwnProperty("dst")) {
171
+                    dstName = field.dst;
172
+                } else {
173
+                    dstName = srcName;
174
+                }
175
+                var forwardedField = yl.getFieldRelativeTo(element, srcName);
176
+
177
+                if (!forwardedField.length) {
178
+                    return;
179
+                }
180
+
181
+                forwardedData[dstName] = yl.getValueFromField(forwardedField);
182
+            } else if (field.type === "javascript") {
183
+                var handler = yl.getForwardHandler(field.handler);
184
+                forwardedData[field.dst || field.handler] = handler(element);
185
+            }
186
+
187
+        });
188
+        return JSON.stringify(forwardedData);
189
+    };
190
+
191
+})(yl.jQuery, yl);

+ 36 - 0
app/staticfile/autocomplete_light/jquery.init.js

@@ -0,0 +1,36 @@
1
+var yl = yl || {};
2
+if (typeof django !== 'undefined' && typeof django.jQuery !== 'undefined') {
3
+    // If django.jQuery is already defined, use it.
4
+    yl.jQuery = django.jQuery;
5
+}
6
+else {
7
+    // We include jquery itself in our widget's media, because we need it.
8
+    // Normally, we expect our widget's reference to admin/js/vendor/jquery/jquery.js
9
+    // to be skipped, because django's own code has already included it.
10
+    // However, if django.jQuery is NOT defined, we know that jquery was not
11
+    // included before we did it ourselves. This can happen if we're not being
12
+    // rendered in a django admin form.
13
+    // However, someone ELSE'S jQuery may have been included before ours, in
14
+    // which case we must ensure that our jquery doesn't override theirs, since
15
+    // it might be a newer version that other code on the page relies on.
16
+    // Thus, we must run jQuery.noConflict(true) here to move our jQuery out of
17
+    // the way.
18
+    yl.jQuery = jQuery.noConflict(true);
19
+}
20
+
21
+// In addition to all of this, we must ensure that the global jQuery and $ are
22
+// defined, because Select2 requires that. jQuery will only be undefined at
23
+// this point if only we or django included it.
24
+if (typeof jQuery === 'undefined') {
25
+    jQuery = yl.jQuery;
26
+    $ = yl.jQuery;
27
+}
28
+else {
29
+    // jQuery IS still defined, which means someone else also included jQuery.
30
+    // In this situation, we need to store the old jQuery in a
31
+    // temp variable, set the global jQuery to our yl.jQuery, then let select2
32
+    // set itself up. We restore the global jQuery to its original value in
33
+    // jquery.post-setup.js.
34
+    dal_jquery_backup = jQuery.noConflict(true);
35
+    jQuery = yl.jQuery;
36
+}

+ 7 - 0
app/staticfile/autocomplete_light/jquery.post-setup.js

@@ -0,0 +1,7 @@
1
+if (typeof dal_jquery_backup !== 'undefined') {
2
+    // We made a backup of the original global jQuery before forcing it to our
3
+    // yl.jQuery value. Now that select2 has been set up, we need to restore
4
+    // our backup to its rightful place.
5
+    jQuery = dal_jquery_backup;
6
+    $ = dal_jquery_backup;
7
+}

+ 14 - 0
app/staticfile/autocomplete_light/select2.css

@@ -0,0 +1,14 @@
1
+.select2-container {
2
+    min-width: 20em;
3
+}
4
+
5
+ul li.select2-selection__choice,
6
+ul li.select2-search {
7
+    /* Cancel out django's style */
8
+    list-style-type: none;
9
+}
10
+
11
+.errors .select2-selection {
12
+    /* Highlight select box with error */
13
+    border-color: #ba2121;
14
+}

+ 122 - 0
app/staticfile/autocomplete_light/select2.js

@@ -0,0 +1,122 @@
1
+;(function ($) {
2
+    if (window.__dal__initListenerIsSet)
3
+        return;
4
+
5
+    $(document).on('autocompleteLightInitialize', '[data-autocomplete-light-function=select2]', function() {
6
+        var element = $(this);
7
+
8
+        // Templating helper
9
+        function template(text, is_html) {
10
+            if (is_html) {
11
+                var $result = $('<span>');
12
+                $result.html(text);
13
+                return $result;
14
+            } else {
15
+                return text;
16
+            }
17
+        }
18
+
19
+        function result_template(item) {
20
+            var text = template(item.text,
21
+                element.attr('data-html') !== undefined || element.attr('data-result-html') !== undefined
22
+            );
23
+
24
+            if (item.create_id) {
25
+                return $('<span></span>').text(text).addClass('dal-create')
26
+            } else {
27
+                return text
28
+            }
29
+        }
30
+
31
+        function selected_template(item) {
32
+            if (item.selected_text !== undefined) {
33
+                return template(item.selected_text,
34
+                    element.attr('data-html') !== undefined || element.attr('data-selected-html') !== undefined
35
+                );
36
+            } else {
37
+                return result_template(item);
38
+            }
39
+            return
40
+        }
41
+
42
+        var ajax = null;
43
+        if ($(this).attr('data-autocomplete-light-url')) {
44
+            ajax = {
45
+                url: $(this).attr('data-autocomplete-light-url'),
46
+                dataType: 'json',
47
+                delay: 250,
48
+
49
+                data: function (params) {
50
+                    var data = {
51
+                        q: params.term, // search term
52
+                        page: params.page,
53
+                        create: element.attr('data-autocomplete-light-create') && !element.attr('data-tags'),
54
+                        forward: yl.getForwards(element)
55
+                    };
56
+
57
+                    return data;
58
+                },
59
+                processResults: function (data, page) {
60
+                    if (element.attr('data-tags')) {
61
+                        $.each(data.results, function(index, value) {
62
+                            value.id = value.text;
63
+                        });
64
+                    }
65
+
66
+                    return data;
67
+                },
68
+                cache: true
69
+            };
70
+        }
71
+
72
+        $(this).select2({
73
+            tokenSeparators: element.attr('data-tags') ? [','] : null,
74
+            debug: true,
75
+            containerCssClass: ':all:',
76
+            placeholder: element.attr('data-placeholder') || '',
77
+            language: element.attr('data-autocomplete-light-language'),
78
+            minimumInputLength: element.attr('data-minimum-input-length') || 0,
79
+            allowClear: ! $(this).is('[required]'),
80
+            templateResult: result_template,
81
+            templateSelection: selected_template,
82
+            ajax: ajax,
83
+            tags: Boolean(element.attr('data-tags')),
84
+        });
85
+
86
+        $(this).on('select2:selecting', function (e) {
87
+            var data = e.params.args.data;
88
+
89
+            if (data.create_id !== true)
90
+                return;
91
+
92
+            e.preventDefault();
93
+
94
+            var select = $(this);
95
+
96
+            $.ajax({
97
+                url: $(this).attr('data-autocomplete-light-url'),
98
+                type: 'POST',
99
+                dataType: 'json',
100
+                data: {
101
+                    text: data.id,
102
+                    forward: yl.getForwards($(this))
103
+                },
104
+                beforeSend: function(xhr, settings) {
105
+                    xhr.setRequestHeader("X-CSRFToken", document.csrftoken);
106
+                },
107
+                success: function(data, textStatus, jqXHR ) {
108
+                    select.append(
109
+                        $('<option>', {value: data.id, text: data.text, selected: true})
110
+                    );
111
+                    select.trigger('change');
112
+                    select.select2('close');
113
+                }
114
+            });
115
+        });
116
+
117
+    });
118
+    window.__dal__initListenerIsSet = true;
119
+    $('[data-autocomplete-light-function=select2]:not([id*="__prefix__"])').each(function() {
120
+        window.__dal__initialize(this);
121
+    });
122
+})(yl.jQuery);

BIN
app/staticfile/img/heartbeat.png


+ 22 - 0
app/staticfile/import_export/action_formats.js

@@ -0,0 +1,22 @@
1
+(function($) {
2
+  $(document).ready(function() {
3
+    var $actionsSelect, $formatsElement;
4
+    if ($('body').hasClass('grp-change-list')) {
5
+        // using grappelli
6
+        $actionsSelect = $('#grp-changelist-form select[name="action"]');
7
+        $formatsElement = $('#grp-changelist-form select[name="file_format"]');
8
+    } else {
9
+        // using default admin
10
+        $actionsSelect = $('#changelist-form select[name="action"]');
11
+        $formatsElement = $('#changelist-form select[name="file_format"]').parent();
12
+    }
13
+    $actionsSelect.change(function() {
14
+      if ($(this).val() === 'export_admin_action') {
15
+        $formatsElement.show();
16
+      } else {
17
+        $formatsElement.hide();
18
+      }
19
+    });
20
+    $actionsSelect.change();
21
+  });
22
+})(django.jQuery);

+ 81 - 0
app/staticfile/import_export/import.css

@@ -0,0 +1,81 @@
1
+.import-preview .errors {
2
+  position: relative;
3
+}
4
+
5
+.validation-error-count {
6
+  display: inline-block;
7
+  background-color: #e40000;
8
+  border-radius: 6px;
9
+  color: white;
10
+  font-size: 0.9em;
11
+  position: relative;
12
+  font-weight: bold;
13
+  margin-top: -2px;
14
+  padding: 0.2em 0.4em;
15
+}
16
+
17
+.validation-error-container {
18
+  position: absolute;
19
+  opacity: 0;
20
+  pointer-events: none;
21
+  background-color: #ffc1c1;
22
+  padding: 14px 15px 10px;
23
+  top: 25px;
24
+  margin: 0 0 20px 0;
25
+  width: 200px;
26
+  z-index: 2;
27
+}
28
+
29
+table.import-preview tr.skip {
30
+  background-color: #d2d2d2;
31
+}
32
+
33
+table.import-preview tr.new {
34
+  background-color: #bdd8b2;
35
+}
36
+
37
+table.import-preview tr.delete {
38
+  background-color: #f9bebf;
39
+}
40
+
41
+table.import-preview tr.update {
42
+  background-color: #fdfdcf;
43
+}
44
+
45
+.import-preview td:hover .validation-error-count {
46
+  z-index: 3;
47
+}
48
+.import-preview td:hover .validation-error-container {
49
+  opacity: 1;
50
+  pointer-events: auto;
51
+}
52
+
53
+.validation-error-list {
54
+  margin: 0;
55
+  padding: 0;
56
+}
57
+
58
+.validation-error-list li {
59
+  list-style: none;
60
+  margin: 0;
61
+}
62
+
63
+.validation-error-list > li > ul {
64
+  margin: 8px 0;
65
+  padding: 0;
66
+}
67
+
68
+.validation-error-list > li > ul > li {
69
+  padding: 0;
70
+  margin: 0 0 10px;
71
+  line-height: 1.28em;
72
+}
73
+
74
+.validation-error-field-label {
75
+  display: block;
76
+  border-bottom: 1px solid #e40000;
77
+  color: #e40000;
78
+  text-transform: uppercase;
79
+  font-weight: bold;
80
+  font-size: 0.85em;
81
+}

+ 15 - 0
app/staticfile/js/main.js

@@ -0,0 +1,15 @@
1
+$(function(){
2
+    $("#currentLocationBtn").click(function(){
3
+        if ("geolocation" in navigator){ //check geolocation available
4
+            //try to get user current location using getCurrentPosition() method
5
+            console.log("current location");
6
+            navigator.geolocation.getCurrentPosition(function(position){
7
+                console.log("xxxx");
8
+                $("#geoText").val(position.coords.latitude+","+position.coords.longitude );
9
+
10
+            });
11
+        }else{
12
+            console.log("Browser doesn't support geolocation!");
13
+        }
14
+    });
15
+});

+ 262 - 0
app/staticfile/vendor/select2/Gruntfile.js

@@ -0,0 +1,262 @@
1
+const sass = require('node-sass');
2
+
3
+module.exports = function (grunt) {
4
+  // Full list of files that must be included by RequireJS
5
+  includes = [
6
+    'jquery.select2',
7
+    'almond',
8
+
9
+    'jquery-mousewheel' // shimmed for non-full builds
10
+  ];
11
+
12
+  fullIncludes = [
13
+    'jquery',
14
+
15
+    'select2/compat/containerCss',
16
+    'select2/compat/dropdownCss',
17
+
18
+    'select2/compat/initSelection',
19
+    'select2/compat/inputData',
20
+    'select2/compat/matcher',
21
+    'select2/compat/query',
22
+
23
+    'select2/dropdown/attachContainer',
24
+    'select2/dropdown/stopPropagation',
25
+
26
+    'select2/selection/stopPropagation'
27
+  ].concat(includes);
28
+
29
+  var i18nModules = [];
30
+  var i18nPaths = {};
31
+
32
+  var i18nFiles = grunt.file.expand({
33
+    cwd: 'src/js'
34
+  }, 'select2/i18n/*.js');
35
+
36
+  var testFiles = grunt.file.expand('tests/**/*.html');
37
+  var testUrls = testFiles.map(function (filePath) {
38
+    return 'http://localhost:9999/' + filePath;
39
+  });
40
+
41
+  var testBuildNumber = "unknown";
42
+
43
+  if (process.env.TRAVIS_JOB_ID) {
44
+    testBuildNumber = "travis-" + process.env.TRAVIS_JOB_ID;
45
+  } else {
46
+    var currentTime = new Date();
47
+
48
+    testBuildNumber = "manual-" + currentTime.getTime();
49
+  }
50
+
51
+  for (var i = 0; i < i18nFiles.length; i++) {
52
+    var file = i18nFiles[i];
53
+    var name = file.split('.')[0];
54
+
55
+    i18nModules.push({
56
+      name: name
57
+    });
58
+
59
+    i18nPaths[name] = '../../' + name;
60
+  }
61
+
62
+  var minifiedBanner = '/*! Select2 <%= package.version %> | https://github.com/select2/select2/blob/master/LICENSE.md */';
63
+
64
+  grunt.initConfig({
65
+    package: grunt.file.readJSON('package.json'),
66
+
67
+    concat: {
68
+      'dist': {
69
+        options: {
70
+          banner: grunt.file.read('src/js/wrapper.start.js'),
71
+        },
72
+        src: [
73
+          'dist/js/select2.js',
74
+          'src/js/wrapper.end.js'
75
+        ],
76
+        dest: 'dist/js/select2.js'
77
+      },
78
+      'dist.full': {
79
+        options: {
80
+          banner: grunt.file.read('src/js/wrapper.start.js'),
81
+        },
82
+        src: [
83
+          'dist/js/select2.full.js',
84
+          'src/js/wrapper.end.js'
85
+        ],
86
+        dest: 'dist/js/select2.full.js'
87
+      }
88
+    },
89
+
90
+    connect: {
91
+      tests: {
92
+        options: {
93
+          base: '.',
94
+          hostname: '127.0.0.1',
95
+          port: 9999
96
+        }
97
+      }
98
+    },
99
+
100
+    uglify: {
101
+      'dist': {
102
+        src: 'dist/js/select2.js',
103
+        dest: 'dist/js/select2.min.js',
104
+        options: {
105
+          banner: minifiedBanner
106
+        }
107
+      },
108
+      'dist.full': {
109
+        src: 'dist/js/select2.full.js',
110
+        dest: 'dist/js/select2.full.min.js',
111
+        options: {
112
+          banner: minifiedBanner
113
+        }
114
+      }
115
+    },
116
+
117
+    qunit: {
118
+      all: {
119
+        options: {
120
+          urls: testUrls
121
+        }
122
+      }
123
+    },
124
+
125
+    jshint: {
126
+      options: {
127
+        jshintrc: true,
128
+        reporterOutput: ''
129
+      },
130
+      code: {
131
+        src: ['src/js/**/*.js']
132
+      },
133
+      tests: {
134
+        src: ['tests/**/*.js']
135
+      }
136
+    },
137
+
138
+    sass: {
139
+      dist: {
140
+        options: {
141
+          implementation: sass,
142
+          outputStyle: 'compressed'
143
+        },
144
+        files: {
145
+          'dist/css/select2.min.css': [
146
+            'src/scss/core.scss',
147
+            'src/scss/theme/default/layout.css'
148
+          ]
149
+        }
150
+      },
151
+      dev: {
152
+        options: {
153
+          implementation: sass,
154
+          outputStyle: 'nested'
155
+        },
156
+        files: {
157
+          'dist/css/select2.css': [
158
+            'src/scss/core.scss',
159
+            'src/scss/theme/default/layout.css'
160
+          ]
161
+        }
162
+      }
163
+    },
164
+
165
+    requirejs: {
166
+      'dist': {
167
+        options: {
168
+          baseUrl: 'src/js',
169
+          optimize: 'none',
170
+          name: 'select2/core',
171
+          out: 'dist/js/select2.js',
172
+          include: includes,
173
+          namespace: 'S2',
174
+          paths: {
175
+            'almond': require.resolve('almond').slice(0, -3),
176
+            'jquery': 'jquery.shim',
177
+            'jquery-mousewheel': 'jquery.mousewheel.shim'
178
+          },
179
+          wrap: {
180
+            startFile: 'src/js/banner.start.js',
181
+            endFile: 'src/js/banner.end.js'
182
+          }
183
+        }
184
+      },
185
+      'dist.full': {
186
+        options: {
187
+          baseUrl: 'src/js',
188
+          optimize: 'none',
189
+          name: 'select2/core',
190
+          out: 'dist/js/select2.full.js',
191
+          include: fullIncludes,
192
+          namespace: 'S2',
193
+          paths: {
194
+            'almond': require.resolve('almond').slice(0, -3),
195
+            'jquery': 'jquery.shim',
196
+            'jquery-mousewheel': require.resolve('jquery-mousewheel').slice(0, -3)
197
+          },
198
+          wrap: {
199
+            startFile: 'src/js/banner.start.js',
200
+            endFile: 'src/js/banner.end.js'
201
+          }
202
+        }
203
+      },
204
+      'i18n': {
205
+        options: {
206
+          baseUrl: 'src/js/select2/i18n',
207
+          dir: 'dist/js/i18n',
208
+          paths: i18nPaths,
209
+          modules: i18nModules,
210
+          namespace: 'S2',
211
+          wrap: {
212
+            start: minifiedBanner + grunt.file.read('src/js/banner.start.js'),
213
+            end: grunt.file.read('src/js/banner.end.js')
214
+          }
215
+        }
216
+      }
217
+    },
218
+
219
+    watch: {
220
+      js: {
221
+        files: [
222
+          'src/js/select2/**/*.js',
223
+          'tests/**/*.js'
224
+        ],
225
+        tasks: [
226
+          'compile',
227
+          'test',
228
+          'minify'
229
+        ]
230
+      },
231
+      css: {
232
+        files: [
233
+          'src/scss/**/*.scss'
234
+        ],
235
+        tasks: [
236
+          'compile',
237
+          'minify'
238
+        ]
239
+      }
240
+    }
241
+  });
242
+
243
+  grunt.loadNpmTasks('grunt-contrib-concat');
244
+  grunt.loadNpmTasks('grunt-contrib-connect');
245
+  grunt.loadNpmTasks('grunt-contrib-jshint');
246
+  grunt.loadNpmTasks('grunt-contrib-qunit');
247
+  grunt.loadNpmTasks('grunt-contrib-requirejs');
248
+  grunt.loadNpmTasks('grunt-contrib-uglify');
249
+  grunt.loadNpmTasks('grunt-contrib-watch');
250
+
251
+  grunt.loadNpmTasks('grunt-sass');
252
+
253
+  grunt.registerTask('default', ['compile', 'test', 'minify']);
254
+
255
+  grunt.registerTask('compile', [
256
+    'requirejs:dist', 'requirejs:dist.full', 'requirejs:i18n',
257
+    'concat:dist', 'concat:dist.full',
258
+    'sass:dev'
259
+  ]);
260
+  grunt.registerTask('minify', ['uglify', 'sass:dist']);
261
+  grunt.registerTask('test', ['connect:tests', 'qunit', 'jshint']);
262
+};

+ 13 - 0
app/staticfile/vendor/select2/bower.json

@@ -0,0 +1,13 @@
1
+{
2
+    "name": "select2",
3
+    "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
4
+    "main": [
5
+        "dist/js/select2.js",
6
+        "src/scss/core.scss"
7
+    ],
8
+    "license": "MIT",
9
+    "repository": {
10
+        "type": "git",
11
+        "url": "git@github.com:select2/select2.git"
12
+    }
13
+}

+ 19 - 0
app/staticfile/vendor/select2/component.json

@@ -0,0 +1,19 @@
1
+{
2
+  "name": "select2",
3
+  "repo": "select/select2",
4
+  "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
5
+  "version": "4.0.7",
6
+  "demo": "https://select2.org/",
7
+  "keywords": [
8
+    "jquery"
9
+  ],
10
+  "main": "dist/js/select2.js",
11
+  "styles": [
12
+    "dist/css/select2.css"
13
+  ],
14
+  "scripts": [
15
+    "dist/js/select2.js",
16
+    "dist/js/i18n/*.js"
17
+  ],
18
+  "license": "MIT"
19
+}

+ 22 - 0
app/staticfile/vendor/select2/composer.json

@@ -0,0 +1,22 @@
1
+{
2
+  "name": "select2/select2",
3
+  "description": "Select2 is a jQuery based replacement for select boxes.",
4
+  "type": "component",
5
+  "homepage": "https://select2.org/",
6
+  "license": "MIT",
7
+  "extra": {
8
+    "component": {
9
+      "scripts": [
10
+        "dist/js/select2.js"
11
+      ],
12
+      "styles": [
13
+        "dist/css/select2.css"
14
+      ],
15
+      "files": [
16
+        "dist/js/select2.js",
17
+        "dist/js/i18n/*.js",
18
+        "dist/css/select2.css"
19
+      ]
20
+    }
21
+  }
22
+}

+ 484 - 0
app/staticfile/vendor/select2/dist/css/select2.css

@@ -0,0 +1,484 @@
1
+.select2-container {
2
+  box-sizing: border-box;
3
+  display: inline-block;
4
+  margin: 0;
5
+  position: relative;
6
+  vertical-align: middle; }
7
+  .select2-container .select2-selection--single {
8
+    box-sizing: border-box;
9
+    cursor: pointer;
10
+    display: block;
11
+    height: 28px;
12
+    user-select: none;
13
+    -webkit-user-select: none; }
14
+    .select2-container .select2-selection--single .select2-selection__rendered {
15
+      display: block;
16
+      padding-left: 8px;
17
+      padding-right: 20px;
18
+      overflow: hidden;
19
+      text-overflow: ellipsis;
20
+      white-space: nowrap; }
21
+    .select2-container .select2-selection--single .select2-selection__clear {
22
+      position: relative; }
23
+  .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
24
+    padding-right: 8px;
25
+    padding-left: 20px; }
26
+  .select2-container .select2-selection--multiple {
27
+    box-sizing: border-box;
28
+    cursor: pointer;
29
+    display: block;
30
+    min-height: 32px;
31
+    user-select: none;
32
+    -webkit-user-select: none; }
33
+    .select2-container .select2-selection--multiple .select2-selection__rendered {
34
+      display: inline-block;
35
+      overflow: hidden;
36
+      padding-left: 8px;
37
+      text-overflow: ellipsis;
38
+      white-space: nowrap; }
39
+  .select2-container .select2-search--inline {
40
+    float: left; }
41
+    .select2-container .select2-search--inline .select2-search__field {
42
+      box-sizing: border-box;
43
+      border: none;
44
+      font-size: 100%;
45
+      margin-top: 5px;
46
+      padding: 0; }
47
+      .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
48
+        -webkit-appearance: none; }
49
+
50
+.select2-dropdown {
51
+  background-color: white;
52
+  border: 1px solid #aaa;
53
+  border-radius: 4px;
54
+  box-sizing: border-box;
55
+  display: block;
56
+  position: absolute;
57
+  left: -100000px;
58
+  width: 100%;
59
+  z-index: 1051; }
60
+
61
+.select2-results {
62
+  display: block; }
63
+
64
+.select2-results__options {
65
+  list-style: none;
66
+  margin: 0;
67
+  padding: 0; }
68
+
69
+.select2-results__option {
70
+  padding: 6px;
71
+  user-select: none;
72
+  -webkit-user-select: none; }
73
+  .select2-results__option[aria-selected] {
74
+    cursor: pointer; }
75
+
76
+.select2-container--open .select2-dropdown {
77
+  left: 0; }
78
+
79
+.select2-container--open .select2-dropdown--above {
80
+  border-bottom: none;
81
+  border-bottom-left-radius: 0;
82
+  border-bottom-right-radius: 0; }
83
+
84
+.select2-container--open .select2-dropdown--below {
85
+  border-top: none;
86
+  border-top-left-radius: 0;
87
+  border-top-right-radius: 0; }
88
+
89
+.select2-search--dropdown {
90
+  display: block;
91
+  padding: 4px; }
92
+  .select2-search--dropdown .select2-search__field {
93
+    padding: 4px;
94
+    width: 100%;
95
+    box-sizing: border-box; }
96
+    .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
97
+      -webkit-appearance: none; }
98
+  .select2-search--dropdown.select2-search--hide {
99
+    display: none; }
100
+
101
+.select2-close-mask {
102
+  border: 0;
103
+  margin: 0;
104
+  padding: 0;
105
+  display: block;
106
+  position: fixed;
107
+  left: 0;
108
+  top: 0;
109
+  min-height: 100%;
110
+  min-width: 100%;
111
+  height: auto;
112
+  width: auto;
113
+  opacity: 0;
114
+  z-index: 99;
115
+  background-color: #fff;
116
+  filter: alpha(opacity=0); }
117
+
118
+.select2-hidden-accessible {
119
+  border: 0 !important;
120
+  clip: rect(0 0 0 0) !important;
121
+  -webkit-clip-path: inset(50%) !important;
122
+  clip-path: inset(50%) !important;
123
+  height: 1px !important;
124
+  overflow: hidden !important;
125
+  padding: 0 !important;
126
+  position: absolute !important;
127
+  width: 1px !important;
128
+  white-space: nowrap !important; }
129
+
130
+.select2-container--default .select2-selection--single {
131
+  background-color: #fff;
132
+  border: 1px solid #aaa;
133
+  border-radius: 4px; }
134
+  .select2-container--default .select2-selection--single .select2-selection__rendered {
135
+    color: #444;
136
+    line-height: 28px; }
137
+  .select2-container--default .select2-selection--single .select2-selection__clear {
138
+    cursor: pointer;
139
+    float: right;
140
+    font-weight: bold; }
141
+  .select2-container--default .select2-selection--single .select2-selection__placeholder {
142
+    color: #999; }
143
+  .select2-container--default .select2-selection--single .select2-selection__arrow {
144
+    height: 26px;
145
+    position: absolute;
146
+    top: 1px;
147
+    right: 1px;
148
+    width: 20px; }
149
+    .select2-container--default .select2-selection--single .select2-selection__arrow b {
150
+      border-color: #888 transparent transparent transparent;
151
+      border-style: solid;
152
+      border-width: 5px 4px 0 4px;
153
+      height: 0;
154
+      left: 50%;
155
+      margin-left: -4px;
156
+      margin-top: -2px;
157
+      position: absolute;
158
+      top: 50%;
159
+      width: 0; }
160
+
161
+.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
162
+  float: left; }
163
+
164
+.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
165
+  left: 1px;
166
+  right: auto; }
167
+
168
+.select2-container--default.select2-container--disabled .select2-selection--single {
169
+  background-color: #eee;
170
+  cursor: default; }
171
+  .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
172
+    display: none; }
173
+
174
+.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
175
+  border-color: transparent transparent #888 transparent;
176
+  border-width: 0 4px 5px 4px; }
177
+
178
+.select2-container--default .select2-selection--multiple {
179
+  background-color: white;
180
+  border: 1px solid #aaa;
181
+  border-radius: 4px;
182
+  cursor: text; }
183
+  .select2-container--default .select2-selection--multiple .select2-selection__rendered {
184
+    box-sizing: border-box;
185
+    list-style: none;
186
+    margin: 0;
187
+    padding: 0 5px;
188
+    width: 100%; }
189
+    .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
190
+      list-style: none; }
191
+  .select2-container--default .select2-selection--multiple .select2-selection__placeholder {
192
+    color: #999;
193
+    margin-top: 5px;
194
+    float: left; }
195
+  .select2-container--default .select2-selection--multiple .select2-selection__clear {
196
+    cursor: pointer;
197
+    float: right;
198
+    font-weight: bold;
199
+    margin-top: 5px;
200
+    margin-right: 10px; }
201
+  .select2-container--default .select2-selection--multiple .select2-selection__choice {
202
+    background-color: #e4e4e4;
203
+    border: 1px solid #aaa;
204
+    border-radius: 4px;
205
+    cursor: default;
206
+    float: left;
207
+    margin-right: 5px;
208
+    margin-top: 5px;
209
+    padding: 0 5px; }
210
+  .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
211
+    color: #999;
212
+    cursor: pointer;
213
+    display: inline-block;
214
+    font-weight: bold;
215
+    margin-right: 2px; }
216
+    .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
217
+      color: #333; }
218
+
219
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
220
+  float: right; }
221
+
222
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
223
+  margin-left: 5px;
224
+  margin-right: auto; }
225
+
226
+.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
227
+  margin-left: 2px;
228
+  margin-right: auto; }
229
+
230
+.select2-container--default.select2-container--focus .select2-selection--multiple {
231
+  border: solid black 1px;
232
+  outline: 0; }
233
+
234
+.select2-container--default.select2-container--disabled .select2-selection--multiple {
235
+  background-color: #eee;
236
+  cursor: default; }
237
+
238
+.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
239
+  display: none; }
240
+
241
+.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
242
+  border-top-left-radius: 0;
243
+  border-top-right-radius: 0; }
244
+
245
+.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
246
+  border-bottom-left-radius: 0;
247
+  border-bottom-right-radius: 0; }
248
+
249
+.select2-container--default .select2-search--dropdown .select2-search__field {
250
+  border: 1px solid #aaa; }
251
+
252
+.select2-container--default .select2-search--inline .select2-search__field {
253
+  background: transparent;
254
+  border: none;
255
+  outline: 0;
256
+  box-shadow: none;
257
+  -webkit-appearance: textfield; }
258
+
259
+.select2-container--default .select2-results > .select2-results__options {
260
+  max-height: 200px;
261
+  overflow-y: auto; }
262
+
263
+.select2-container--default .select2-results__option[role=group] {
264
+  padding: 0; }
265
+
266
+.select2-container--default .select2-results__option[aria-disabled=true] {
267
+  color: #999; }
268
+
269
+.select2-container--default .select2-results__option[aria-selected=true] {
270
+  background-color: #ddd; }
271
+
272
+.select2-container--default .select2-results__option .select2-results__option {
273
+  padding-left: 1em; }
274
+  .select2-container--default .select2-results__option .select2-results__option .select2-results__group {
275
+    padding-left: 0; }
276
+  .select2-container--default .select2-results__option .select2-results__option .select2-results__option {
277
+    margin-left: -1em;
278
+    padding-left: 2em; }
279
+    .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
280
+      margin-left: -2em;
281
+      padding-left: 3em; }
282
+      .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
283
+        margin-left: -3em;
284
+        padding-left: 4em; }
285
+        .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
286
+          margin-left: -4em;
287
+          padding-left: 5em; }
288
+          .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
289
+            margin-left: -5em;
290
+            padding-left: 6em; }
291
+
292
+.select2-container--default .select2-results__option--highlighted[aria-selected] {
293
+  background-color: #5897fb;
294
+  color: white; }
295
+
296
+.select2-container--default .select2-results__group {
297
+  cursor: default;
298
+  display: block;
299
+  padding: 6px; }
300
+
301
+.select2-container--classic .select2-selection--single {
302
+  background-color: #f7f7f7;
303
+  border: 1px solid #aaa;
304
+  border-radius: 4px;
305
+  outline: 0;
306
+  background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%);
307
+  background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%);
308
+  background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
309
+  background-repeat: repeat-x;
310
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
311
+  .select2-container--classic .select2-selection--single:focus {
312
+    border: 1px solid #5897fb; }
313
+  .select2-container--classic .select2-selection--single .select2-selection__rendered {
314
+    color: #444;
315
+    line-height: 28px; }
316
+  .select2-container--classic .select2-selection--single .select2-selection__clear {
317
+    cursor: pointer;
318
+    float: right;
319
+    font-weight: bold;
320
+    margin-right: 10px; }
321
+  .select2-container--classic .select2-selection--single .select2-selection__placeholder {
322
+    color: #999; }
323
+  .select2-container--classic .select2-selection--single .select2-selection__arrow {
324
+    background-color: #ddd;
325
+    border: none;
326
+    border-left: 1px solid #aaa;
327
+    border-top-right-radius: 4px;
328
+    border-bottom-right-radius: 4px;
329
+    height: 26px;
330
+    position: absolute;
331
+    top: 1px;
332
+    right: 1px;
333
+    width: 20px;
334
+    background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
335
+    background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
336
+    background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
337
+    background-repeat: repeat-x;
338
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); }
339
+    .select2-container--classic .select2-selection--single .select2-selection__arrow b {
340
+      border-color: #888 transparent transparent transparent;
341
+      border-style: solid;
342
+      border-width: 5px 4px 0 4px;
343
+      height: 0;
344
+      left: 50%;
345
+      margin-left: -4px;
346
+      margin-top: -2px;
347
+      position: absolute;
348
+      top: 50%;
349
+      width: 0; }
350
+
351
+.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
352
+  float: left; }
353
+
354
+.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
355
+  border: none;
356
+  border-right: 1px solid #aaa;
357
+  border-radius: 0;
358
+  border-top-left-radius: 4px;
359
+  border-bottom-left-radius: 4px;
360
+  left: 1px;
361
+  right: auto; }
362
+
363
+.select2-container--classic.select2-container--open .select2-selection--single {
364
+  border: 1px solid #5897fb; }
365
+  .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
366
+    background: transparent;
367
+    border: none; }
368
+    .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
369
+      border-color: transparent transparent #888 transparent;
370
+      border-width: 0 4px 5px 4px; }
371
+
372
+.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
373
+  border-top: none;
374
+  border-top-left-radius: 0;
375
+  border-top-right-radius: 0;
376
+  background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%);
377
+  background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%);
378
+  background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
379
+  background-repeat: repeat-x;
380
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
381
+
382
+.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
383
+  border-bottom: none;
384
+  border-bottom-left-radius: 0;
385
+  border-bottom-right-radius: 0;
386
+  background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%);
387
+  background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%);
388
+  background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
389
+  background-repeat: repeat-x;
390
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); }
391
+
392
+.select2-container--classic .select2-selection--multiple {
393
+  background-color: white;
394
+  border: 1px solid #aaa;
395
+  border-radius: 4px;
396
+  cursor: text;
397
+  outline: 0; }
398
+  .select2-container--classic .select2-selection--multiple:focus {
399
+    border: 1px solid #5897fb; }
400
+  .select2-container--classic .select2-selection--multiple .select2-selection__rendered {
401
+    list-style: none;
402
+    margin: 0;
403
+    padding: 0 5px; }
404
+  .select2-container--classic .select2-selection--multiple .select2-selection__clear {
405
+    display: none; }
406
+  .select2-container--classic .select2-selection--multiple .select2-selection__choice {
407
+    background-color: #e4e4e4;
408
+    border: 1px solid #aaa;
409
+    border-radius: 4px;
410
+    cursor: default;
411
+    float: left;
412
+    margin-right: 5px;
413
+    margin-top: 5px;
414
+    padding: 0 5px; }
415
+  .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
416
+    color: #888;
417
+    cursor: pointer;
418
+    display: inline-block;
419
+    font-weight: bold;
420
+    margin-right: 2px; }
421
+    .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
422
+      color: #555; }
423
+
424
+.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
425
+  float: right;
426
+  margin-left: 5px;
427
+  margin-right: auto; }
428
+
429
+.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
430
+  margin-left: 2px;
431
+  margin-right: auto; }
432
+
433
+.select2-container--classic.select2-container--open .select2-selection--multiple {
434
+  border: 1px solid #5897fb; }
435
+
436
+.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
437
+  border-top: none;
438
+  border-top-left-radius: 0;
439
+  border-top-right-radius: 0; }
440
+
441
+.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
442
+  border-bottom: none;
443
+  border-bottom-left-radius: 0;
444
+  border-bottom-right-radius: 0; }
445
+
446
+.select2-container--classic .select2-search--dropdown .select2-search__field {
447
+  border: 1px solid #aaa;
448
+  outline: 0; }
449
+
450
+.select2-container--classic .select2-search--inline .select2-search__field {
451
+  outline: 0;
452
+  box-shadow: none; }
453
+
454
+.select2-container--classic .select2-dropdown {
455
+  background-color: white;
456
+  border: 1px solid transparent; }
457
+
458
+.select2-container--classic .select2-dropdown--above {
459
+  border-bottom: none; }
460
+
461
+.select2-container--classic .select2-dropdown--below {
462
+  border-top: none; }
463
+
464
+.select2-container--classic .select2-results > .select2-results__options {
465
+  max-height: 200px;
466
+  overflow-y: auto; }
467
+
468
+.select2-container--classic .select2-results__option[role=group] {
469
+  padding: 0; }
470
+
471
+.select2-container--classic .select2-results__option[aria-disabled=true] {
472
+  color: grey; }
473
+
474
+.select2-container--classic .select2-results__option--highlighted[aria-selected] {
475
+  background-color: #3875d7;
476
+  color: white; }
477
+
478
+.select2-container--classic .select2-results__group {
479
+  cursor: default;
480
+  display: block;
481
+  padding: 6px; }
482
+
483
+.select2-container--classic.select2-container--open .select2-dropdown {
484
+  border-color: #5897fb; }

File diff suppressed because it is too large
+ 1 - 0
app/staticfile/vendor/select2/dist/css/select2.min.css


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/af.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/ar.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/az.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/bg.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/bn.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/bs.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/ca.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/cs.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/da.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/de.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/dsb.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/el.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/en.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/es.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/et.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/eu.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/fa.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/fi.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/fr.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/gl.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/he.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/hi.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/hr.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/hsb.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/hu.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/hy.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/id.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/is.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/it.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/ja.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/ka.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/km.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/ko.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/lt.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/lv.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/mk.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/ms.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/nb.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/ne.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/nl.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/pl.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/ps.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/pt-BR.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/pt.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/ro.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/ru.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/sk.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/sl.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/sq.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/sr-Cyrl.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/sr.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/sv.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/th.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/tk.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/tr.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/uk.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/vi.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/zh-CN.js


File diff suppressed because it is too large
+ 3 - 0
app/staticfile/vendor/select2/dist/js/i18n/zh-TW.js


File diff suppressed because it is too large
+ 6597 - 0
app/staticfile/vendor/select2/dist/js/select2.full.js


File diff suppressed because it is too large
+ 2 - 0
app/staticfile/vendor/select2/dist/js/select2.full.min.js


File diff suppressed because it is too large
+ 5885 - 0
app/staticfile/vendor/select2/dist/js/select2.js


File diff suppressed because it is too large
+ 2 - 0
app/staticfile/vendor/select2/dist/js/select2.min.js


+ 12 - 0
app/staticfile/vendor/select2/docs/announcements-4.0.html

@@ -0,0 +1,12 @@
1
+<!DOCTYPE html>
2
+<html>
3
+  <head>
4
+    <meta charset="UTF-8">
5
+    <title>select2</title>
6
+  </head>
7
+  <body>
8
+    <script>
9
+      window.location = 'https://select2.org/upgrading/new-in-40';
10
+    </script>
11
+  </body>
12
+</html>

+ 12 - 0
app/staticfile/vendor/select2/docs/community.html

@@ -0,0 +1,12 @@
1
+<!DOCTYPE html>
2
+<html>
3
+  <head>
4
+    <meta charset="UTF-8">
5
+    <title>select2</title>
6
+  </head>
7
+  <body>
8
+    <script>
9
+      window.location = 'https://select2.org/getting-help';
10
+    </script>
11
+  </body>
12
+</html>

+ 12 - 0
app/staticfile/vendor/select2/docs/examples.html

@@ -0,0 +1,12 @@
1
+<!DOCTYPE html>
2
+<html>
3
+  <head>
4
+    <meta charset="UTF-8">
5
+    <title>select2</title>
6
+  </head>
7
+  <body>
8
+    <script>
9
+      window.location = 'https://select2.org/getting-started/basic-usage';
10
+    </script>
11
+  </body>
12
+</html>

+ 12 - 0
app/staticfile/vendor/select2/docs/index.html

@@ -0,0 +1,12 @@
1
+<!DOCTYPE html>
2
+<html>
3
+  <head>
4
+    <meta charset="UTF-8">
5
+    <title>select2</title>
6
+  </head>
7
+  <body>
8
+    <script>
9
+      window.location = 'https://select2.org';
10
+    </script>
11
+  </body>
12
+</html>

+ 12 - 0
app/staticfile/vendor/select2/docs/options-old.html

@@ -0,0 +1,12 @@
1
+<!DOCTYPE html>
2
+<html>
3
+  <head>
4
+    <meta charset="UTF-8">
5
+    <title>select2</title>
6
+  </head>
7
+  <body>
8
+    <script>
9
+      window.location = 'https://select2.org/configuration';
10
+    </script>
11
+  </body>
12
+</html>

+ 12 - 0
app/staticfile/vendor/select2/docs/options.html

@@ -0,0 +1,12 @@
1
+<!DOCTYPE html>
2
+<html>
3
+  <head>
4
+    <meta charset="UTF-8">
5
+    <title>select2</title>
6
+  </head>
7
+  <body>
8
+    <script>
9
+      window.location = 'https://select2.org/configuration';
10
+    </script>
11
+  </body>
12
+</html>

+ 65 - 0
app/staticfile/vendor/select2/package.json

@@ -0,0 +1,65 @@
1
+{
2
+  "name": "select2",
3
+  "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
4
+  "homepage": "https://select2.org",
5
+  "author": {
6
+    "name": "Kevin Brown",
7
+    "url": "https://github.com/kevin-brown"
8
+  },
9
+  "contributors": [
10
+    {
11
+      "name": "Igor Vaynberg",
12
+      "url": "https://github.com/ivaynberg"
13
+    },
14
+    {
15
+      "name": "Alex Weissman",
16
+      "url": "https://github.com/alexweissman"
17
+    }
18
+  ],
19
+  "repository": {
20
+    "type": "git",
21
+    "url": "git://github.com/select2/select2.git"
22
+  },
23
+  "bugs": {
24
+    "url": "https://github.com/select2/select2/issues"
25
+  },
26
+  "keywords": [
27
+    "select",
28
+    "autocomplete",
29
+    "typeahead",
30
+    "dropdown",
31
+    "multiselect",
32
+    "tag",
33
+    "tagging"
34
+  ],
35
+  "license": "MIT",
36
+  "main": "dist/js/select2.js",
37
+  "style": "dist/css/select2.css",
38
+  "files": [
39
+    "src",
40
+    "dist"
41
+  ],
42
+  "version": "4.0.7",
43
+  "jspm": {
44
+    "main": "js/select2",
45
+    "directories": {
46
+      "lib": "dist"
47
+    }
48
+  },
49
+  "devDependencies": {
50
+    "almond": "~0.3.1",
51
+    "grunt": "^0.4.5",
52
+    "grunt-cli": "^1.3.2",
53
+    "grunt-contrib-concat": "^1.0.1",
54
+    "grunt-contrib-connect": "^2.0.0",
55
+    "grunt-contrib-jshint": "^1.1.0",
56
+    "grunt-contrib-qunit": "^1.3.0",
57
+    "grunt-contrib-requirejs": "^1.0.0",
58
+    "grunt-contrib-uglify": "~4.0.1",
59
+    "grunt-contrib-watch": "~1.1.0",
60
+    "grunt-sass": "^2.1.0",
61
+    "jquery-mousewheel": "~3.1.13",
62
+    "node-sass": "^4.12.0"
63
+  },
64
+  "dependencies": {}
65
+}

+ 6 - 0
app/staticfile/vendor/select2/src/js/banner.end.js

@@ -0,0 +1,6 @@
1
+  // Return the AMD loader configuration so it can be used outside of this file
2
+  return {
3
+    define: S2.define,
4
+    require: S2.require
5
+  };
6
+}());

+ 0 - 0
app/staticfile/vendor/select2/src/js/banner.start.js


Some files were not shown because too many files changed in this diff

tum/whitesports - Gogs: Simplico Git Service

Няма описание

configuration.php 76KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059
  1. <?php
  2. /**
  3. * Copy & Delete Posts – default menu.
  4. *
  5. * @package CDP
  6. * @subpackage Configuration
  7. * @author CopyDeletePosts
  8. * @since 1.0.0
  9. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  10. // Exit if accessed directly.
  11. if (!defined('ABSPATH')) exit;
  12. /** –– **\
  13. * Adding assets.
  14. * @since 1.0.0
  15. */
  16. add_action('admin_enqueue_scripts', function() {
  17. if (cdp_check_permissions(wp_get_current_user()) == false) return;
  18. $current_screen = get_current_screen();
  19. if (!is_object($current_screen)) return;
  20. if (function_exists('wp_doing_ajax') && wp_doing_ajax()) return;
  21. wp_enqueue_script('cdp');
  22. wp_enqueue_script('jquery-ui-draggable');
  23. wp_enqueue_script('jquery-ui-droppable');
  24. wp_enqueue_script('jquery-ui-sortable');
  25. wp_enqueue_style('cdp-css');
  26. });
  27. /** –– **/
  28. /** –– **\
  29. * Adding assets.
  30. * @since 1.0.9
  31. */
  32. add_action('cdp_notices_special', function() {
  33. if (cdp_check_permissions(wp_get_current_user()) == false) return;
  34. if (!get_option('cdp_dismiss_perf_notice', false) && get_option('cdp_latest_slow_performance', false)) {
  35. cdp_render_performance_notice();
  36. }
  37. });
  38. /** –– **/
  39. /** –– **\
  40. * Main plugin configuration menu.
  41. * @since 1.0.0
  42. */
  43. function cdp_configuration() {
  44. if (cdp_check_permissions(wp_get_current_user()) == false) return;
  45. global $cdp_plug_url;
  46. $current_user = wp_get_current_user();
  47. $user_id = get_current_user_id();
  48. $no_intro = (get_option('_cdp_no_intro')) ? get_option('_cdp_no_intro') : array();
  49. $has_intro = !in_array($user_id, $no_intro) || false;
  50. $profiles = get_option('_cdp_profiles');
  51. $defaults = get_option('_cdp_profiles');
  52. if ($defaults && array_key_exists('default', $defaults)) $defaults = $defaults['default'];
  53. else $defaults = cdp_default_options();
  54. $globals = get_option('_cdp_globals');
  55. $roles = get_editable_roles();
  56. $isCoolInstalled = '';
  57. if (get_option('_cdp_cool_installation', false)) {
  58. delete_option('_cdp_cool_installation');
  59. $isCoolInstalled = ' cdp_is_cool_installed';
  60. }
  61. $names_format = false;
  62. $after_copy = false;
  63. $post_converter = false;
  64. $gos = cdp_default_global_options();
  65. if (isset($defaults['names']))
  66. if (isset($defaults['names']['format'])) $names_format = intval($defaults['names']['format']);
  67. if (isset($globals)) {
  68. if (isset($globals['afterCopy'])) $after_copy = $globals['afterCopy'];
  69. if (isset($globals['postConverter'])) $post_converter = $globals['postConverter'];
  70. if (isset($globals['others'])) $gos = $globals['others'];
  71. }
  72. if (!array_key_exists('cdp-display-bulk', $gos)) $gos = cdp_default_global_options();
  73. // Ask for pro features
  74. $areWePro = areWePro();
  75. if (!$has_intro) {
  76. $intro = ' style="display: none;"';
  77. $content = '';
  78. } else {
  79. $intro = '';
  80. $content = ' style="display: none; opacity: 0;"';
  81. }
  82. $isYoast = false; $isUSM = false; $isWoo = false;
  83. if (is_plugin_active('woocommerce/woocommerce.php')) $isWoo = true;
  84. if (is_plugin_active('wordpress-seo/wp-seo.php') || is_plugin_active('wordpress-seo-premium/wp-seo-premium.php')) $isYoast = true;
  85. if (
  86. is_plugin_active('USM-Premium/usm_premium_icons.php') ||
  87. is_plugin_active('Ultimate-Social-Media-Plus/ultimate_social_media_icons.php') ||
  88. is_plugin_active('Ultimate-Social-Media-Icons/ultimate_social_media_icons.php') ||
  89. is_plugin_active('Ultimate-Premium-Plugin/usm_premium_icons.php') ||
  90. is_plugin_active('ultimate-social-media-icons/ultimate_social_media_icons.php') ||
  91. is_plugin_active('ultimate-social-media-plus/ultimate-social-media-plus.php') ||
  92. is_plugin_active('ultimate-social-media-plus/ultimate_social_media_plus.php')
  93. ) $isUSM = true;
  94. ?>
  95. <style>
  96. #wpcontent {padding-left: 2px !important;}
  97. /* #wpbody {overflow-y: scroll;overflow-x: auto;max-height: calc(100vh - 32px);} */
  98. #wpfooter { display: none; padding-bottom: 30vh; }
  99. #wpfooter #footer-left { display: none; }
  100. #wpfooter #footer-upgrade { display: none; }
  101. </style>
  102. <?php if ($areWePro && function_exists('cdpp_profile_manager_html')) cdpp_profile_manager_html(); ?>
  103. <?php if ($areWePro && function_exists('cdpp_delete_redi_modal')) cdpp_delete_redi_modal(); ?>
  104. <div class="cdp-preloader-c<?php echo $isCoolInstalled ?>">
  105. <div class="cdp-center"><?php _e('Loading...', 'copy-delete-posts'); ?></div>
  106. <div class="cdp-preloader"></div>
  107. </div>
  108. <div class="cdp-container cdp-main-menu-cont" style="display: none;">
  109. <div class="cdp-content">
  110. <div class="cdp-cf">
  111. <div class="cdp-left">
  112. <!-- <h1 class="cdp-f-s-30 cdp-f-w-light cdp-welcome-title-after">Welcome<?php echo ' ' . $current_user->user_login . ','; ?> to Copy & Delete Posts!</h1> -->
  113. <h1 class="cdp-f-s-30 cdp-f-w-medium cdp-welcome-title-after"><?php _e('Welcome to Copy & Delete Posts!', 'copy-delete-posts'); ?></h1>
  114. </div>
  115. <div class="cdp-right">
  116. <div class="cdp-s-i-a cdp-welcome-title-after cdp-text-right cdp-green"<?php echo $content ?>><a class="cdp-pointer" id="cdp-show-into-again"><span class="cdp-green cdp-f-s-16"><?php _e('Show intro', 'copy-delete-posts'); ?></span></a></div>
  117. </div>
  118. </div>
  119. <?php do_action('cdp_notices_special'); ?>
  120. <div class="cdp-intro"<?php echo $intro ?>>
  121. <div class="cdp-box cdp-white-bg cdp-shadow">
  122. <div class="cdp-font-heading cdp-f-s-21 cdp-f-w-regular"><?php _e('You can now easily copy posts & pages in various areas:', 'copy-delete-posts'); ?></div>
  123. <div class="cdp-cf">
  124. <div class="cdp-showcase-3 cdp-left">
  125. <div class="cdp-font-title cdp-f-s-22 cdp-f-w-bold cdp-center"><?php _e('List of posts/pages', 'copy-delete-posts'); ?></div>
  126. <div class="cfg-img-sc-3 cdp-intro-image cdp-intro-img-1" alt="lists">
  127. <img src="<?php echo $cdp_plug_url; ?>/assets/imgs/intro_1.gif" class="cdp-no-vis cfg-img-sc-3" alt="lists">
  128. </div>
  129. </div>
  130. <div class="cdp-showcase-3 cdp-left">
  131. <div class="cdp-font-title cdp-f-s-22 cdp-f-w-bold cdp-center"><?php _e('Edit screen', 'copy-delete-posts'); ?></div>
  132. <div class="cfg-img-sc-3 cdp-intro-image cdp-intro-img-2" alt="edit">
  133. <img src="<?php echo $cdp_plug_url; ?>/assets/imgs/intro_2.gif" class="cdp-no-vis cfg-img-sc-3" alt="edit">
  134. </div>
  135. </div>
  136. <div class="cdp-showcase-3 cdp-left">
  137. <div class="cdp-font-title cdp-f-s-22 cdp-f-w-bold cdp-center"><?php _e('Admin bar', 'copy-delete-posts'); ?></div>
  138. <div class="cfg-img-sc-3 cdp-intro-image cdp-intro-img-3" alt="adminbar">
  139. <img src="<?php echo $cdp_plug_url; ?>/assets/imgs/intro_3.gif" class="cdp-no-vis cfg-img-sc-3 cfg-img-sc-3-special" alt="adminbar">
  140. </div>
  141. </div>
  142. </div>
  143. <div class="cdp-center cdp-font-footer"><?php _e('…and you can also <b>delete duplicate</b> posts easily, see below :)', 'copy-delete-posts'); ?></div>
  144. <div class="cdp-center cdp-intro-options">
  145. <button class="cdp-intro-button cdp-f-s-21 cdp-f-w-bold"><?php _e('Got it, close intro!', 'copy-delete-posts'); ?></button>
  146. <div class="cdp-ff-b1 cdp-checkboxes cdp-hide" style="margin-top: 5px;">
  147. <label for="cdp-never-intro">
  148. <input type="checkbox" checked id="cdp-never-intro" style="margin-top: -3px !important"/>
  149. <?php _e('Don\'t show this intro – never again!', 'copy-delete-posts'); ?>
  150. </label>
  151. </div>
  152. </div>
  153. </div>
  154. </div>
  155. <div class="cdp-cf cdp-profile-bar">
  156. <div class="cdp-left cdp-lh-48 cdp-f-s-20">
  157. <div class="cdp-cf">
  158. <div class="cdp-left cdp-f-w-light">
  159. <?php _e('Below are your', 'copy-delete-posts'); ?>
  160. </div>
  161. <select class="cdp-left cdp-profile-selected cdp-select-styled cdp-select cdp-select-padding cdp-ow-border cdp-f-s-19 cdp-color-p-i<?php echo ((!$areWePro)?' cdp-premium-in-select':''); ?>">
  162. <?php
  163. $preSelProf = get_option('_cdp_preselections')[intval(get_current_user_id())];
  164. if ($profiles != false && $areWePro) {
  165. foreach ($profiles as $profile => $vals):
  166. $isSel = ($preSelProf == $profile);
  167. ?>
  168. <option value="<?php echo htmlspecialchars($profile); ?>"<?php echo ($isSel)?' selected':''?>><?php echo ucfirst(htmlspecialchars($vals['names']['display'])); ?></option>
  169. <?php endforeach; } else { ?>
  170. <option value="default" selected><?php _e('Default', 'copy-delete-posts'); ?></option>
  171. <option value="premium" disabled><?php _e('Add new', 'copy-delete-posts'); ?></option>
  172. <?php } ?>
  173. </select>
  174. <div class="cdp-left cdp-f-w-light">
  175. <?php _e('settings', 'copy-delete-posts'); ?>
  176. </div>
  177. </div>
  178. </div>
  179. <div class="cdp-right cdp-lh-48 cdp-relative">
  180. <div>
  181. <span class="cdp-tooltip-premium" style="padding: 25px 0">
  182. <span class="cdp-manager-btns cdp-green cdp-hover cdp-pointer cdp-f-w-light cdp-f-s-16" style="padding-right: 33px;"><?php _e('+ Add / manage / import / export settings', 'copy-delete-posts'); ?></span>
  183. <span class="cdp-premium-icon cdp-big-icon" style="right: 3px;"></span>
  184. </span>
  185. </div>
  186. </div>
  187. </div>
  188. <div class="cdp-collapsibles" style="padding-top: 5px;">
  189. <!-- SETTINGS PROFILE SECTION -->
  190. <div class="cdp-collapsible" data-cdp-group="mains">
  191. <div class="cdp-collapsible-title">
  192. <div class="cdp-cf">
  193. <div class="cdp-left cdp-ff-b1"><?php _e('Which <b class="cdp-ff-b4">elements</b> shall be copied?', 'copy-delete-posts'); ?></div>
  194. <div class="cdp-right"><i class="cdp-arrow cdp-arrow-left"></i></div>
  195. </div>
  196. </div>
  197. <div class="cdp-collapsible-content cdp-nm cdp-np">
  198. <div style="overflow-x: auto; max-width: 100%;">
  199. <table class="cdp-table">
  200. <thead class="cdp-thead cdp-f-s-18">
  201. <tr>
  202. <th></th>
  203. <th><?php _e('<b>If checked</b> copies will...', 'copy-delete-posts'); ?></th>
  204. <th><?php _e('<b>If <u class="cdp-f-w-bold">un</u>checked</b> copies will...', 'copy-delete-posts'); ?></th>
  205. </tr>
  206. </thead>
  207. <tbody class="cdp-ff-b1 cdp-f-s-18 cdp-tbody-of-settings">
  208. <tr>
  209. <td><label class="cdp-relative"><input <?php echo $defaults['title']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="title" type="checkbox" /><span><?php _e('Title', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  210. <td><?php _e('…get the title as defined in the <a href="#" class="cdp-go-to-names-chapter"><span class="cdp-green">next section</span></a>.', 'copy-delete-posts'); ?></td>
  211. <td><?php _e('…be titled “Untitled”.', 'copy-delete-posts'); ?></td>
  212. </tr>
  213. <tr>
  214. <td><label class="cdp-relative"><input <?php echo $defaults['date']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="date" type="checkbox" /><span><?php _e('Date', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  215. <td><?php _e('…get the same creation date & time as the original.', 'copy-delete-posts'); ?></td>
  216. <td><?php _e('…get the date & time at time of copying. ', 'copy-delete-posts'); ?></td>
  217. </tr>
  218. <tr>
  219. <td><label class="cdp-relative"><input <?php echo $defaults['status']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="status" type="checkbox" /><span><?php _e('Status', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  220. <td><?php _e('…get status of original article (which can be “published” or “deleted” etc.)', 'copy-delete-posts'); ?></td>
  221. <td><?php _e('…get the status “Draft”.', 'copy-delete-posts'); ?></td>
  222. </tr>
  223. <tr>
  224. <td><label class="cdp-relative"><input <?php echo $defaults['slug']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="slug" type="checkbox" /><span><?php _e('Slug', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  225. <td><?php _e('…get the same <a href="https://kinsta.com/knowledgebase/wordpress-slug/" target="_blank"><span class="cdp-green">slug</span></a> of the original. (However after publishing it will give it automatically a new slug because 2 pages cannot be on the same URL).', 'copy-delete-posts'); ?></td>
  226. <td><?php _e('…get a blank slug, unless the page is published, then it will generate it automatically.', 'copy-delete-posts'); ?></td>
  227. </tr>
  228. <tr>
  229. <td><label class="cdp-relative"><input <?php echo $defaults['excerpt']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="excerpt" type="checkbox" /><span><?php _e('Excerpt', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  230. <td><?php _e('…get the custom <a href="https://wordpress.org/support/article/excerpt/" target="_blank"><span class="cdp-green">excerpt</span></a> (post/page summary) of the original (if the original had any).', 'copy-delete-posts'); ?></td>
  231. <td><?php _e('…get an empty <i>custom</i> excerpt (and default to taking the first 55 words of the post).', 'copy-delete-posts'); ?></td>
  232. </tr>
  233. <tr>
  234. <td><label class="cdp-relative"><input <?php echo $defaults['content']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="content" type="checkbox" /><span><?php _e('Content', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  235. <td><?php _e('…get all the content (text, images, videos and other elements/blocks) from the original.', 'copy-delete-posts'); ?></td>
  236. <td><?php _e('…get no content (be completely blank).', 'copy-delete-posts'); ?></td>
  237. </tr>
  238. <tr>
  239. <td><label class="cdp-relative"><input <?php echo $defaults['f_image']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="f_image" type="checkbox" /><span><?php _e('Featured image', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  240. <td><?php _e('…it will set the same <a href="https://firstsiteguide.com/wordpress-featured-image/" target="_blank"><span class="cdp-green">featured image</span></a> as the original.', 'copy-delete-posts'); ?></td>
  241. <td><?php _e('…get no featured image.', 'copy-delete-posts'); ?></td>
  242. </tr>
  243. <tr>
  244. <td><label class="cdp-relative"><input <?php echo $defaults['template']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="template" type="checkbox" /><span><?php _e('Template', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  245. <td><?php _e('…get the same page <a href="https://wpapprentice.com/blog/wordpress-theme-vs-template/" target="_blank"><span class="cdp-green">template</span></a> as original.', 'copy-delete-posts'); ?></td>
  246. <td><?php _e('…get the default page template.', 'copy-delete-posts'); ?></td>
  247. </tr>
  248. <tr>
  249. <td><label class="cdp-relative"><input <?php echo $defaults['format']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="format" type="checkbox" /><span><?php _e('Format', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  250. <td><?php _e('…get the same <a href="https://wordpress.org/support/article/post-formats/" target="_blank"><span class="cdp-green">post format</span></a> as original.', 'copy-delete-posts'); ?></td>
  251. <td><?php _e('…get the standard post format.', 'copy-delete-posts'); ?></td>
  252. </tr>
  253. <tr>
  254. <td><label class="cdp-relative"><input <?php echo $defaults['author']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="author" type="checkbox" /><span><?php _e('Author', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  255. <td><?php _e('…get the same author as original.', 'copy-delete-posts'); ?></td>
  256. <td><?php _e('…get the user that is duplicating as an author.', 'copy-delete-posts'); ?></td>
  257. </tr>
  258. <tr>
  259. <td><label class="cdp-relative"><input <?php echo $defaults['password']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="password" type="checkbox" /><span><?php _e('Password', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  260. <td><?php _e('…get the same <a href="https://wordpress.org/support/article/using-password-protection/" target="_blank"><span class="cdp-green">password</span></a> as original.', 'copy-delete-posts'); ?></td>
  261. <td><?php _e('…get no password.', 'copy-delete-posts'); ?></td>
  262. </tr>
  263. <tr>
  264. <td><label class="cdp-relative"><input <?php echo $defaults['attachments']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="attachments" type="checkbox" /><span><?php _e('Attachments', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  265. <td><?php _e('…create new <a href="https://wordpress.org/support/article/using-image-and-file-attachments/#attachment-to-a-post" target="_blank"><span class="cdp-green">attachments</span></a> (duplicates in Media Library) as well. <i>Recommended only for Multisites.</i>', 'copy-delete-posts'); ?></td>
  266. <td><?php _e('…get existing attachments from the original.', 'copy-delete-posts'); ?></td>
  267. </tr>
  268. <tr>
  269. <td><label class="cdp-relative"><input <?php echo $defaults['children']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="children" type="checkbox" /><span><?php _e('Children', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  270. <td><?php _e('…get their <a href="https://phppot.com/wordpress/how-to-create-a-child-page-in-wordpress/" target="_blank"><span class="cdp-green">child pages</span></a> copied as well, with all current settings applied to child-duplicates (if the page is a parent).', 'copy-delete-posts'); ?></td>
  271. <td><?php _e('…not get their child pages copied along (if the page is a parent).', 'copy-delete-posts'); ?></td>
  272. </tr>
  273. <tr>
  274. <td><label class="cdp-relative"><input <?php echo $defaults['comments']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="comments" type="checkbox" /><span><?php _e('Comments', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  275. <td><?php _e('…get all comments from the original.', 'copy-delete-posts'); ?></td>
  276. <td><?php _e('…get no comments from the original.', 'copy-delete-posts'); ?></td>
  277. </tr>
  278. <tr>
  279. <td><label class="cdp-relative"><input <?php echo $defaults['menu_order']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="menu_order" type="checkbox" /><span><?php _e('Menu order', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  280. <td><?php _e('…get the <a href="https://wordpress.stackexchange.com/questions/25202/how-to-change-order-of-menu-items" target="_blank"><span class="cdp-green">menu order</span></a> from the original.', 'copy-delete-posts'); ?></td>
  281. <td><?php _e('…get the menu order set to default (0).', 'copy-delete-posts'); ?></td>
  282. </tr>
  283. <tr>
  284. <td><label class="cdp-relative"><input <?php echo $defaults['category']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="category" type="checkbox" /><span><?php _e('Categories', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  285. <td><?php _e('…get all categories from the original post.', 'copy-delete-posts'); ?></td>
  286. <td><?php _e('…be Uncategorized, no categories will be copied.', 'copy-delete-posts'); ?></td>
  287. </tr>
  288. <tr>
  289. <td><label class="cdp-relative"><input <?php echo $defaults['post_tag']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="post_tag" type="checkbox" /><span><?php _e('Tags', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  290. <td><?php _e('…get all tags of the original post.', 'copy-delete-posts'); ?></td>
  291. <td><?php _e('…be without any tags.', 'copy-delete-posts'); ?></td>
  292. </tr>
  293. <tr>
  294. <td><label class="cdp-relative"><input <?php echo $defaults['taxonomy']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="taxonomy" type="checkbox" /><span><?php _e('Taxonomies', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  295. <td><?php _e('…get all custom taxonomy from the original.', 'copy-delete-posts'); ?></td>
  296. <td><?php _e('…be without custom taxonomy.', 'copy-delete-posts'); ?></td>
  297. </tr>
  298. <tr>
  299. <td>
  300. <label>
  301. <div class="cdp-cf">
  302. <div class="cdp-left">
  303. <input <?php echo $defaults['nav_menu']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="nav_menu" type="checkbox" />
  304. </div>
  305. <div class="cdp-left cdp-relative" style="width: calc(100% - 45px)">
  306. <span><?php _e('Navigation Menus', 'copy-delete-posts'); ?> <span class="cdp-info-icon" style="top: calc(50% + 4px) !important;"></span> </span>
  307. </div>
  308. </div>
  309. </label>
  310. </td>
  311. <td><?php _e('…get this private taxonomy from the original.', 'copy-delete-posts'); ?></td>
  312. <td><?php _e('…be without private taxonomy.', 'copy-delete-posts'); ?></td>
  313. </tr>
  314. <tr>
  315. <td><label class="cdp-relative"><input <?php echo $defaults['link_category']=='true'?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="link_category" type="checkbox" /><span><?php _e('Link categories', 'copy-delete-posts'); ?> <span class="cdp-info-icon"></span></span></label></td>
  316. <td><?php _e('…get this private taxonomy from the original.', 'copy-delete-posts'); ?></td>
  317. <td><?php _e('…be without private taxonomy.', 'copy-delete-posts'); ?></td>
  318. </tr>
  319. <?php if (false): ?>
  320. <tr>
  321. <td class="cdp-tooltip-premium">
  322. <label>
  323. <div class="cdp-cf">
  324. <div class="cdp-left">
  325. <input <?php echo (array_key_exists('all_metadata', $defaults) && $defaults['all_metadata']=='true' && $areWePro == true)?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="all_metadata" type="checkbox" />
  326. </div>
  327. <div class="cdp-left cdp-relative" style="width: calc(100% - 45px)">
  328. <span><?php _e('Other Plugin Settings', 'copy-delete-posts'); ?><span class="cdp-premium-icon cdp-big-icon" style="top: calc(50% + 2px) !important;"></span> </span>
  329. </div>
  330. </div>
  331. </label>
  332. </td>
  333. <td><?php _e('…clone all metadata tags assigned to post/page.', 'copy-delete-posts'); ?></td>
  334. <td><?php _e('…copy only required post/page metadata.', 'copy-delete-posts'); ?></td>
  335. </tr>
  336. <?php endif; ?>
  337. <tr<?php echo (!$isWoo)?' style="display: none;"':'' ?>>
  338. <td class="cdp-tooltip-premium">
  339. <label>
  340. <div class="cdp-cf">
  341. <div class="cdp-left">
  342. <input <?php echo (array_key_exists('woo', $defaults) && $defaults['woo']=='true' && $areWePro == true)?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="woo" type="checkbox" />
  343. </div>
  344. <div class="cdp-left cdp-relative" style="width: calc(100% - 45px)">
  345. <span><?php _e('WooCommerce Settings', 'copy-delete-posts'); ?><span class="cdp-premium-icon cdp-big-icon" style="top: calc(50% + 2px) !important;"></span> </span>
  346. </div>
  347. </div>
  348. </label>
  349. </td>
  350. <td><?php _e('…the same settings from the <a href="https://wordpress.org/plugins/woocommerce/" target="_blank"><span class="cdp-green">WooCommerce plugin</span></a> as the original.', 'copy-delete-posts'); ?></td>
  351. <td><?php _e('…get empty settings.', 'copy-delete-posts'); ?></td>
  352. </tr>
  353. <tr<?php echo (!$isUSM)?' style="display: none;"':'' ?>>
  354. <td class="cdp-tooltip-premium">
  355. <label>
  356. <div class="cdp-cf">
  357. <div class="cdp-left">
  358. <input <?php echo ($defaults['usmplugin']=='true' && $areWePro == true)?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="usmplugin" type="checkbox" />
  359. </div>
  360. <div class="cdp-left cdp-relative" style="width: calc(100% - 45px)">
  361. <span><?php _e('Ultimate Social Media Settings', 'copy-delete-posts'); ?><span class="cdp-premium-icon cdp-big-icon" style="top: calc(50% + 2px) !important;"></span> </span>
  362. </div>
  363. </div>
  364. </label>
  365. </td>
  366. <td><?php _e('…the same settings from the <a href="https://www.ultimatelysocial.com/usm-premium/" target="_blank"><span class="cdp-green">Ultimate Social Media plugin</span></a> as the original.', 'copy-delete-posts'); ?></td>
  367. <td><?php _e('…get empty settings.', 'copy-delete-posts'); ?></td>
  368. </tr>
  369. <tr<?php echo (!$isYoast)?' style="display: none;"':'' ?>>
  370. <td class="cdp-tooltip-premium">
  371. <label>
  372. <div class="cdp-cf">
  373. <div class="cdp-left">
  374. <input <?php echo ($defaults['yoast']=='true' && $areWePro == true)?'checked ':''; ?>class="cdp-data-set" data-cdp-opt="yoast" type="checkbox" />
  375. </div>
  376. <div class="cdp-left cdp-relative" style="width: calc(100% - 45px)">
  377. <span><?php _e('Yoast SEO Settings', 'copy-delete-posts'); ?> <span class="cdp-premium-icon cdp-big-icon" style="top: calc(50% + 2px) !important;"></span> </span>
  378. </div>
  379. </div>
  380. </label>
  381. </td>
  382. <td><?php _e('…the same settings from the <a href="https://wordpress.org/plugins/wordpress-seo/" target="_blank"><span class="cdp-green">Yoast SEO plugin</span></a> as the original.', 'copy-delete-posts'); ?></td>
  383. <td><?php _e('…get empty settings.', 'copy-delete-posts'); ?></td>
  384. </tr>
  385. </tbody>
  386. </table>
  387. <div class="cdp-pad-lin cdp-gray cdp-f-s-18 cdp-lh-24 cdp-center" style="padding-top: 40px; padding-bottom: 20px;">
  388. <i><?php _e('Do you know anything else you want to have copied (e.g. data added by a different plugin)? <br />
  389. Please <a href="mailto:hi@copy-delete-posts.com" target="_blank"><span class="cdp-green">tell us about it</span></a>, we always want to further improve this plugin! :) ', 'copy-delete-posts'); ?></i>
  390. </div>
  391. <div class="cdp-center cdp-padding cdp-p-35-b">
  392. <button class="cdp-button cdp-save-options"><?php _e('Save', 'copy-delete-posts'); ?></button>
  393. <div class="cdp-padding cdp-f-s-17">
  394. <a href="#" class="cdp-close-chapter"><?php _e('Close section', 'copy-delete-posts'); ?></a>
  395. </div>
  396. </div>
  397. </div>
  398. </div>
  399. </div>
  400. <!-- OTHER SETTINGS PROFILE SECTION -->
  401. <div class="cdp-collapsible" data-cdp-group="mains">
  402. <div class="cdp-collapsible-title cdp-name-section-cnx">
  403. <div class="cdp-cf">
  404. <div class="cdp-left cdp-ff-b1"><?php _e('What <b class="cdp-ff-b4">name(s)</b> should the copies have?', 'copy-delete-posts'); ?></div>
  405. <div class="cdp-right"><i class="cdp-arrow cdp-arrow-left"></i></div>
  406. </div>
  407. </div>
  408. <div class="cdp-collapsible-content cdp-np cdp-drags-cont">
  409. <div class="cdp-pad-lin cdp-f-s-18 cdp-f-w-light">
  410. <?php _e('Build your preferred naming logic for the copies:', 'copy-delete-posts'); ?>
  411. </div>
  412. <div class="cdp-green-bg cdp-pad-lin" style="padding-bottom: 20px;">
  413. <div class="cdp-cf cdp-center">
  414. <div class="cdp-left cdp-names-input cdp-f-s-16"><?php _e('Prefix', 'copy-delete-posts'); ?></div>
  415. <div class="cdp-left cdp-names-divider cdp-nlh"></div>
  416. <div class="cdp-left cdp-names-input cdp-f-s-16"><?php _e('Suffix', 'copy-delete-posts'); ?></div>
  417. </div>
  418. <div class="cdp-cf cdp-center">
  419. <div class="cdp-left cdp-names-input">
  420. <div strip-br="true" class="cdp-magic-input cdp-shadow cdp-sorts cdp-names-real-input cdp-names-prefix" wrap="off" contenteditable="true" style="margin-right: 0">
  421. <?php echo (isset($defaults['names']) && isset($defaults['names']['prefix']))?$defaults['names']['prefix']:''; ?>
  422. </div>
  423. </div>
  424. <div class="cdp-left cdp-names-divider cdp-f-s-19 cdp-f-w-light">
  425. <span class="cdp-tooltip-top cdp-togglable-name-b" title="<?php _e('Change to blank', 'copy-delete-posts'); ?>"><?php _e('(Name of original)', 'copy-delete-posts'); ?></span>
  426. </div>
  427. <div class="cdp-left cdp-names-input">
  428. <div strip-br="true" class="cdp-magic-input cdp-shadow cdp-sorts cdp-names-real-input cdp-names-suffix" wrap="off" contenteditable="true" style="margin-left: 0">
  429. <?php echo (isset($defaults['names']) && isset($defaults['names']['suffix']))?$defaults['names']['suffix']:''; ?>
  430. </div>
  431. </div>
  432. </div>
  433. <div class="cdp-curr-cont">
  434. <span class="cdp-f-s-18"><?php _e('Example based on current selections:', 'copy-delete-posts'); ?></span>
  435. <span class="cdp-f-s-16 cdp-padding-10-h">
  436. <span class="cdp-example-name cdp-f-w-bold"><?php _e('(Name of original)', 'copy-delete-posts'); ?></span>
  437. </span>
  438. </div>
  439. </div>
  440. <div class="cdp-pad-lin cdp-f-s-18">
  441. <div class="cdp-padding-23-h"><?php _e('Drag & drop the automatic elements into the Prefix/Suffix fields to add them.', 'copy-delete-posts'); ?></div>
  442. <div class="">
  443. <div class="cdp-cf cdp-padding-10-h">
  444. <div class="cdp-left">
  445. <div class="cdp-name-box cdp-drag-name cdp-name-clickable" oncontextmenu="return false;" data-cdp-val="0"><?php _e('Counter', 'copy-delete-posts'); ?></div>
  446. </div>
  447. <div class="cdp-left cdp-names-text-info"><?php _e('Adds an <b class="cdp-f-w-semi-bold">incremental counter</b> (starting with “2”)', 'copy-delete-posts'); ?></div>
  448. </div>
  449. <div class="cdp-cf cdp-padding-10-h">
  450. <div class="cdp-left" style="margin-top: 6px;">
  451. <div class="cdp-name-box cdp-drag-name cdp-name-clickable" oncontextmenu="return false;" data-cdp-val="2"><?php _e('CurrentDate', 'copy-delete-posts'); ?></div>
  452. </div>
  453. <div class="cdp-left cdp-names-text-info">
  454. <div class="cdp-cf" style="line-height: 49px !important;">
  455. <div class="cdp-left">
  456. <?php _e('Adds the <b class="cdp-f-w-semi-bold">current date</b> in', 'copy-delete-posts'); ?>
  457. </div>
  458. <select class="cdp-left cdp-select-styled cdp-date-picked cdp-select cdp-dd-p-43 cdp-select-padding cdp-ow-border cdp-f-s-19 cdp-select-black cdp-option-premium" name="cdp-date-option">
  459. <option value="1"<?php echo ($names_format == 1 || $names_format == false || (!$areWePro && $names_format == 3))?' selected':''; ?>><?php _e('mm/dd/yyyy', 'copy-delete-posts'); ?></option>
  460. <option value="2"<?php echo ($names_format == 2)?' selected':''; ?>><?php _e('dd/mm/yyyy', 'copy-delete-posts'); ?></option>
  461. <option value="3"<?php echo (($areWePro && $names_format == 3)?' selected':''); ?>><?php _e('Custom', 'copy-delete-posts'); ?></option>
  462. </select>
  463. <?php if ($areWePro && function_exists('cdpp_custom_date')) cdpp_custom_date($names_format, $defaults); ?>
  464. <div class="cdp-left" style="padding-left: 15px;"><?php _e('format.', 'copy-delete-posts'); ?></div>
  465. </div>
  466. <?php if ($areWePro && function_exists('cdpp_custom_date_info')) cdpp_custom_date_info(); ?>
  467. </div>
  468. </div>
  469. <div class="cdp-cf cdp-padding-10-h" style="padding-bottom: 0; margin-top: 6px;">
  470. <div class="cdp-left">
  471. <div class="cdp-name-box cdp-drag-name cdp-name-clickable" oncontextmenu="return false;" data-cdp-val="1"><?php _e('CurrentTime', 'copy-delete-posts'); ?></div>
  472. </div>
  473. <div class="cdp-left cdp-names-text-info"><?php _e('Adds the <b class="cdp-f-w-semi-bold">current time</b> in hh:mm:ss format', 'copy-delete-posts'); ?></div>
  474. </div>
  475. </div>
  476. <div class="cdp-padding-23-h">
  477. <p class="cdp-f-s-18"><?php _e('You can also type tailored text into the fields above.', 'copy-delete-posts'); ?></p>
  478. <p class="cdp-f-s-18"><?php _e('If you’re not of the drag & droppy-type, you can also enter shortcodes [Counter], [CurrentDate] and [CurrentTime].', 'copy-delete-posts'); ?></p>
  479. <p class="cdp-f-s-18"><?php _e('If you make multiple copies in one go, use the Counter-option as otherwise some copies will have the same name.', 'copy-delete-posts'); ?></p>
  480. </div>
  481. <div class="cdp-center">
  482. <button class="cdp-button cdp-save-options"><?php _e('Save', 'copy-delete-posts'); ?></button>
  483. <div class="cdp-padding cdp-f-s-17">
  484. <a href="#" class="cdp-close-chapter"><?php _e('Close section', 'copy-delete-posts'); ?></a>
  485. </div>
  486. </div>
  487. </div>
  488. </div>
  489. </div>
  490. <!-- GLOBAL SECTION -->
  491. <div class="cdp-collapsible" data-cdp-group="mains">
  492. <div class="cdp-collapsible-title">
  493. <div class="cdp-cf">
  494. <div class="cdp-left cdp-ff-b1"><?php _e('<b class="cdp-ff-b4">Other</b> options', 'copy-delete-posts'); ?></div>
  495. <div class="cdp-right"><i class="cdp-arrow cdp-arrow-left"></i></div>
  496. </div>
  497. </div>
  498. <div class="cdp-collapsible-content cdp-oth-section cdp-np cdp-special-cb-p">
  499. <div class="cdp-pad-lin">
  500. <div><h2 class="cdp-f-s-18"><b class="cdp-f-w-bold"><?php _e('Navigation after copying', 'copy-delete-posts'); ?></b></h2></div>
  501. <div class="cdp-padding-15-h">
  502. <div class="cdp-con-cen">
  503. <select class="cdp-other-options cdp-select cdp-select-centered cdp-sel-separat cdp-select-large cdp-dd-p-40 cdp-c-x-a-v" name="after_copy">
  504. <option value="1"<?php echo ($after_copy == '1' || $after_copy == false)?' selected':''; ?>><?php _e('Leave me where I was', 'copy-delete-posts'); ?></option>
  505. <option value="2"<?php echo ($after_copy == '2')?' selected':''; ?>><?php _e('Take me to the edit-page of the created copy', 'copy-delete-posts'); ?></option>
  506. <option value="3"<?php echo ($after_copy == '3')?' selected':''; ?>><?php _e('Decide on a case-by-case basis (adds new button on copy screen)', 'copy-delete-posts'); ?></option>
  507. </select>
  508. </div>
  509. <div class="cdp-if-edit-page-selected cdp-con-cen cdp-f-s-18 cdp-f-w-light cdp-p-25-40" style="display: none;"><?php _e('If you created multiple copies in one go, you’ll be taken to the first copy.', 'copy-delete-posts'); ?> </div>
  510. </div>
  511. <div>
  512. <h2>
  513. <b class="cdp-relative cdp-f-s-18 cdp-f-w-bold cdp-tooltip-premium" data-top="5" style="padding-right: 30px;"><?php _e('Pages vs. Posts converter', 'copy-delete-posts'); ?> <span class="cdp-premium-icon cdp-big-icon"></span></b>
  514. </h2>
  515. </div>
  516. <div class="cdp-f-s-18 cdp-f-w-light">
  517. <p class="cdp-f-s-18 cdp-f-w-light"><?php _e('By default, the type of what you copy does not change, i.e. if you copy a post the new version will also be a post, and the same for pages.', 'copy-delete-posts'); ?></p>
  518. <p class="cdp-padding-15-h cdp-f-s-18 cdp-f-w-light"><?php _e('If you want to make a page out of a post, or vice versa, then you can do this on a <b class="cdp-f-w-bold">case by case basis</b> if you select the option “Define it specifically for this case” in the copy-tooltip, and then select this option on the following screen in the tooltip.', 'copy-delete-posts'); ?></p>
  519. <p class="cdp-f-s-18 cdp-f-w-light"><?php _e('However, if you want it as a <b class="cdp-f-w-bold">default setting option</b>, then please select it below: ', 'copy-delete-posts'); ?></p>
  520. </div>
  521. <div class="cdp-con-cen">
  522. <div class="cdp-tooltip-premium" style="width: 663px; margin: 0 auto; height: 60px;" data-top="-10">
  523. <select class="cdp-other-options cdp-select cdp-select-centered cdp-sel-separat cdp-select-large cdp-c-x-a-v" name="post_converter">
  524. <option value="1"<?php echo ($post_converter == '1' || $post_converter == false)?' selected':''; ?>><?php _e('Copies will be the same type as the original', 'copy-delete-posts'); ?></option>
  525. <option value="2"<?php echo ($post_converter == '2')?' selected':''; ?>><?php _e('ALWAYS change the type when copied (posts will become pages, pages will become posts)', 'copy-delete-posts'); ?></option>
  526. </select>
  527. </div>
  528. </div>
  529. <div class=""><h2><b class="cdp-f-s-18 cdp-f-w-bold"><?php _e('User level permissions', 'copy-delete-posts'); ?></b></h2></div>
  530. <div class="cdp-f-s-18 cdp-p-15-25 cdp-f-w-light"><?php _e('Which user role(s) should be able to copy & delete? <i style="color: gray">– The role also must have access to the dashboard.</i>', 'copy-delete-posts'); ?></div>
  531. <div class="cdp-p-25-40 cdp-f-s-18 cdp-f-w-light">
  532. <?php
  533. $isSaved = false;
  534. if (isset($globals)) $isSaved = true;
  535. foreach ($roles as $role => $value) {
  536. $checked = '';
  537. $rn = sanitize_text_field($role);
  538. $role = sanitize_text_field($value['name']);
  539. $d = ($role == 'Administrator')?' disabled checked="checked"':'';
  540. if ($isSaved && $role != 'Administrator')
  541. if (isset($globals['roles'][$rn]) && $globals['roles'][$rn] == 'true')
  542. $checked = ' checked';
  543. echo('<label for="cdp-roles-'.$rn.'"><input class="cdp-other-roles" id="cdp-roles-'.$rn.'"'.$checked.' type="checkbox"'.$d.' name="'.$rn.'">'.$role.'</label>');
  544. }
  545. ?>
  546. </div>
  547. <div class=""><h2><b class="cdp-f-s-18 cdp-f-w-bold"><?php _e('Content types which can be copied', 'copy-delete-posts'); ?></b></h2></div>
  548. <div class="cdp-p-25-40 cdp-f-s-18 cdp-f-w-light">
  549. <label for="cdp-o-pages"><input <?php echo ($gos['cdp-content-pages'] == 'true')?'checked ':''; ?>id="cdp-o-pages" type="checkbox" class="cdp-other-inputs" name="cdp-content-pages"><?php _e('Pages', 'copy-delete-posts'); ?></label>
  550. <label for="cdp-o-posts"><input <?php echo ($gos['cdp-content-posts'] == 'true')?'checked ':''; ?>id="cdp-o-posts" type="checkbox" class="cdp-other-inputs" name="cdp-content-posts"><?php _e('Posts', 'copy-delete-posts'); ?></label>
  551. <label for="cdp-o-custom"><input <?php echo ($gos['cdp-content-custom'] == 'true')?'checked ':''; ?>id="cdp-o-custom" type="checkbox" class="cdp-other-inputs" name="cdp-content-custom"><?php _e('Custom posts types', 'copy-delete-posts'); ?></label>
  552. </div>
  553. <div class=""><h2><b class="cdp-f-s-18 cdp-f-w-bold"><?php _e('Display copy option on...', 'copy-delete-posts'); ?></b></h2></div>
  554. <div class="cdp-p-25-40 cdp-f-s-18 cdp-f-w-light">
  555. <label for="cdp-o-postspages"><input <?php echo ($gos['cdp-display-posts'] == 'true')?'checked ':''; ?>id="cdp-o-postspages" type="checkbox" class="cdp-other-inputs" name="cdp-display-posts"><?php _e('Posts/pages lists', 'copy-delete-posts'); ?></label>
  556. <label for="cdp-o-edit"><input <?php echo ($gos['cdp-display-edit'] == 'true')?'checked ':''; ?>id="cdp-o-edit" type="checkbox" class="cdp-other-inputs" name="cdp-display-edit"><?php _e('Edit screens', 'copy-delete-posts'); ?></label>
  557. <label for="cdp-o-admin"><input <?php echo ($gos['cdp-display-admin'] == 'true')?'checked ':''; ?>id="cdp-o-admin" type="checkbox" class="cdp-other-inputs" name="cdp-display-admin"><?php _e('Admin bar', 'copy-delete-posts'); ?></label>
  558. <label for="cdp-o-bulk"><input <?php echo ($gos['cdp-display-bulk'] == 'true')?'checked ':''; ?>id="cdp-o-bulk" type="checkbox" class="cdp-other-inputs" name="cdp-display-bulk"><?php _e('Bulk actions menu', 'copy-delete-posts'); ?></label>
  559. <label for="cdp-o-gutenberg"><input <?php echo ($gos['cdp-display-gutenberg'] == 'true')?'checked ':''; ?>id="cdp-o-gutenberg" type="checkbox" class="cdp-other-inputs" name="cdp-display-gutenberg"><?php _e('Gutenberg editor', 'copy-delete-posts'); ?></label>
  560. </div>
  561. <div class=""><h2><b class="cdp-f-s-18 cdp-f-w-bold"><?php _e('Show reference to original item?', 'copy-delete-posts'); ?></b></h2></div>
  562. <div class="cdp-f-s-18 cdp-f-w-light cdp-p-15-25"><?php _e('If checked, you will see a reference to the original post/page (on the copied version).', 'copy-delete-posts'); ?></div>
  563. <div class="cdp-p-25-40 cdp-f-s-18 cdp-f-w-light">
  564. <label for="cdp-o-posts2"><input <?php echo ($gos['cdp-references-post'] == 'true')?'checked ':''; ?>id="cdp-o-posts2" type="checkbox" class="cdp-other-inputs" name="cdp-references-post"><?php _e('Posts/pages lists', 'copy-delete-posts'); ?></label>
  565. <label for="cdp-o-edits2"><input <?php echo ($gos['cdp-references-edit'] == 'true')?'checked ':''; ?>id="cdp-o-edits2" type="checkbox" class="cdp-other-inputs" name="cdp-references-edit"><?php _e('Edit screens', 'copy-delete-posts'); ?></label>
  566. </div>
  567. <div><h2><b class="cdp-f-s-18 cdp-f-w-bold"><?php _e('Additional features', 'copy-delete-posts'); ?></b></h2></div>
  568. <div class="cdp-p-25-40 cdp-f-s-18 cdp-f-w-light">
  569. <label for="cdp-o-premium-hide-tooltip">
  570. <?php if (!isset($gos['cdp-premium-hide-tooltip'])) $gos['cdp-premium-hide-tooltip'] = false; ?>
  571. <input id="cdp-o-premium-hide-tooltip"<?php echo ((!$areWePro)?' disabled="true"':''); ?> <?php echo ($areWePro && $gos['cdp-premium-hide-tooltip'] == 'true')?'checked ':''; ?> type="checkbox" class="cdp-other-inputs" name="cdp-premium-hide-tooltip" />
  572. <span class="cdp-relative cdp-tooltip-premium" data-top="5"><?php _e('Hide copy tooltip on hover and only show the button', 'copy-delete-posts'); ?> <span class="cdp-premium-icon cdp-big-icon" style="right: -30px"></span></span>
  573. </label>
  574. <label for="cdp-o-premium-import">
  575. <?php if (!isset($gos['cdp-premium-import'])) $gos['cdp-premium-import'] = false; ?>
  576. <input id="cdp-o-premium-import"<?php echo ((!$areWePro)?' disabled="true"':''); ?> <?php echo ($areWePro && $gos['cdp-premium-import'] == 'true')?'checked ':''; ?> type="checkbox" class="cdp-other-inputs" name="cdp-premium-import" />
  577. <span class="cdp-relative cdp-tooltip-premium" data-top="5"><?php _e('Show post export & import buttons', 'copy-delete-posts'); ?> <span class="cdp-premium-icon cdp-big-icon" style="right: -30px"></span></span>
  578. </label>
  579. <label for="cdp-o-menu-in-settings">
  580. <input <?php echo (isset($gos['cdp-menu-in-settings']) && $gos['cdp-menu-in-settings'] == 'true')?'checked ':''; ?>id="cdp-o-menu-in-settings" type="checkbox" class="cdp-other-inputs" name="cdp-menu-in-settings">
  581. <?php _e('Hide Copy & Delete Posts Menu under <b>Tools</b> dropdown', 'copy-delete-posts'); ?>
  582. </label>
  583. </div>
  584. <div class="cdp-center cdp-padding-15-h">
  585. <button class="cdp-button cdp-save-options"><?php _e('Save', 'copy-delete-posts'); ?></button>
  586. <div class="cdp-padding cdp-f-s-17">
  587. <a href="#" class="cdp-close-chapter"><?php _e('Close section', 'copy-delete-posts'); ?></a>
  588. </div>
  589. </div>
  590. </div>
  591. </div>
  592. </div>
  593. <div class="cdp-f-s-20 cdp-p-hh">
  594. <?php _e('...and after your copy frenzy, you may need to…', 'copy-delete-posts'); ?>
  595. </div>
  596. <!-- DELETE SECTION -->
  597. <div class="cdp-collapsible" data-cdp-group="mains">
  598. <div class="cdp-d-xclicked cdp-collapsible-title">
  599. <div class="cdp-cf">
  600. <div class="cdp-left cdp-ff-b1"><b class="cdp-ff-b4"><?php _e('Delete duplicate posts/pages', 'copy-delete-posts'); ?></b></div>
  601. <div class="cdp-right"><i class="cdp-arrow cdp-arrow-left"></i></div>
  602. </div>
  603. </div>
  604. <div class="cdp-collapsible-content cdp-d-section cdp-np">
  605. <div class="cdp-padding">
  606. <div class="cdp-backup-alert cdp-f-s-20 cdp-f-w-light">
  607. <?php _e('Before you delete anything here (which cannot be undone!) we <b class="cdp-f-w-bold">strongly suggest</b><br />
  608. that you create a backup, for example with <a href="https://wordpress.org/plugins/wp-clone-by-wp-academy/" target="_blank">this plugin</a>', 'copy-delete-posts'); ?>
  609. </div>
  610. <div class="cdp-cf cdp-tab-list">
  611. <div class="cdp-left cdp-tab-element cdp-tab-active" data-box="cdp-tabox-manual">
  612. <span><?php _e('Manual Cleanup', 'copy-delete-posts'); ?></span>
  613. </div>
  614. <div class="cdp-left cdp-tab-element cdp-tooltip-premium" data-top="-4" data-box="cdp-tabox-automatic"<?php echo ((!$areWePro)?' data-disabled="true"':''); ?>>
  615. <span class="cdp-relative"><?php _e('Automatic Cleanup', 'copy-delete-posts'); ?> <span class="cdp-premium-icon cdp-big-icon"></span></span>
  616. </div>
  617. <div class="cdp-left cdp-tab-element" data-box="cdp-tabox-redirects">
  618. <span class="cdp-relative"><?php _e('Redirection', 'copy-delete-posts'); ?> <span class="cdp-premium-icon cdp-big-icon"></span></span>
  619. </div>
  620. </div>
  621. <div class="cdp-cont-d-box-tabed" id="cdp-tabox-redirects">
  622. <?php if ($areWePro && function_exists('cdpp_automated_redirects')) { ?>
  623. <?php cdpp_automated_redirects($cdp_plug_url); ?>
  624. <?php } else { ?>
  625. <div class="cdp-con-cen">
  626. <div class="cdp-center cdp-padding" style="padding-top: 50px; padding-bottom: 30px;">
  627. <img src="<?php echo $cdp_plug_url; ?>/assets/imgs/redirections.png" alt="">
  628. </div>
  629. <div class="cdp-lh-24 cdp-black-all" style="max-width: 82%; margin: 0 auto;">
  630. <div class="cdp-f-s-19 cdp-f-w-regular cdp-padding">
  631. <?php _e('As part of the <span class="cdp-green">premium plugin</span> you can enable redirects, so that the URLs of your deleted posts/pages automatically take visitors to the version which you decided to keep.', 'copy-delete-posts'); ?>
  632. </div>
  633. <div class="cdp-f-s-19 cdp-f-w-regular cdp-padding">
  634. <?php _e('This isn’t just good for your visitors, but also for SEO: the “link juice” from your old (deleted) articles will be forwarded to the versions you keep, helping you to rank higher in search engines.', 'copy-delete-posts'); ?>
  635. </div>
  636. <div class="cdp-f-s-19 cdp-f-w-regular cdp-padding">
  637. <?php _e('And: you can also use this feature for any other redirections you may need
  638. (not only redirects from deleted posts/pages)!', 'copy-delete-posts'); ?>
  639. </div>
  640. </div>
  641. <br />
  642. <div class="cdp-center cdp-padding-15-h" style="padding-bottom: 60px;">
  643. <a href="https://sellcodes.com/CylMIdJD" target="_blank">
  644. <button class="cdp-button cdp-f-s-21 cdp-f-w-medium" style="width: 465px; height: 70px; border-radius: 35px;"><?php _e('Go premium now', 'copy-delete-posts'); ?></button>
  645. </a>
  646. </div>
  647. </div>
  648. <?php } ?>
  649. </div>
  650. <div class="cdp-cont-d-box-tabed" id="cdp-tabox-automatic">
  651. <?php if ($areWePro && function_exists('cdpp_automated_deletion')) { ?>
  652. <?php cdpp_automated_deletion($cdp_plug_url); ?>
  653. <?php } ?>
  654. </div>
  655. <div class="cdp-cont-d-box-tabed" id="cdp-tabox-manual">
  656. <!-- ABOVE DELETION TABLE -->
  657. <div class="cdp-d-pad-sp" style="padding-top: 20px">
  658. <div class="cdp-special-cb-p">
  659. <div class="cdp-d-header cdp-f-s-19">
  660. <?php _e('Scan for duplicates in...', 'copy-delete-posts'); ?>
  661. </div>
  662. <div class="cdp-p-25-40 cdp-f-s-18">
  663. <label><input type="checkbox" name="cdp-d-a-posts" checked class="cdp-d-option cdp-d-first-chapter-cb" /><?php _e('Posts', 'copy-delete-posts'); ?></label>
  664. <label><input type="checkbox" name="cdp-d-a-pages" checked class="cdp-d-option cdp-d-first-chapter-cb" /><?php _e('Pages', 'copy-delete-posts'); ?></label>
  665. <label><input type="checkbox" name="cdp-d-a-customs" checked class="cdp-d-option cdp-d-first-chapter-cb" /><?php _e('Custom posts', 'copy-delete-posts'); ?></label>
  666. </div>
  667. </div>
  668. <div class="cdp-special-cb-p">
  669. <div class="cdp-d-header cdp-f-s-19">
  670. <?php _e('Count them as duplicates if they are identical with respect to <u class="cdp-f-w-bold">all</u> of the below...', 'copy-delete-posts'); ?>
  671. </div>
  672. <div>
  673. <div class="cdp-p-25-t cdp-cf">
  674. <div class="cdp-left cdp-f-s-18">
  675. <label style="margin-right: 5px;"><input type="checkbox" checked name="cdp-d-b-title" class="cdp-d-option"/><?php _e('Title', 'copy-delete-posts'); ?></label>
  676. </div>
  677. <div class="cdp-left" style="margin-top: 1px; margin-left: 5px; font-size: 13px;">
  678. <a href="#" class="cdp-show-more-d-title cdp-f-s-16" style="line-height: 43px;"><?php _e('(show more options)', 'copy-delete-posts'); ?></a>
  679. </div>
  680. <div class="cdp-left cdp-f-s-18" style="margin-left: 50px;">
  681. <label><input type="checkbox" name="cdp-d-b-slug" class="cdp-d-option" /><?php _e('Similar slug', 'copy-delete-posts'); ?> <span class="cdp-tooltip-top" title="<?php _e('Slugs are never 100% identical (i.e. Wordpress adds a counter automatically to ensure they are unique). The rule to only have them at least 85% identical does the job fine (you can see after the scan which posts are considered identical).', 'copy-delete-posts'); ?>">(x ≥ 85%)</span></label>
  682. </div>
  683. </div>
  684. <div class="cdp-p-20-h cdp-more-d-title" style="display: none; padding-left: 37px;">
  685. <div class="cdp-f-s-17 cdp-p-20-b cdp-lh-24">
  686. <?php _e('Do you want to consider different titles still to be identical if a) the copied posts/pages<br />were created by this plugin and b) they were not modified thereafter?', 'copy-delete-posts'); ?>
  687. </div>
  688. <div class="cdp-cf">
  689. <label class="cdp-left cdp-f-s-18"><input type="radio" class="cdp-d-option cdp-radio" value="0" name="cdp-radio-btn-dtitles" checked><?php _e('No', 'copy-delete-posts'); ?></label>
  690. <label class="cdp-left cdp-f-s-18"><input type="radio" class="cdp-d-option cdp-radio" value="1" name="cdp-radio-btn-dtitles"><?php _e('Yes', 'copy-delete-posts'); ?></label>
  691. <span class="cdp-green cdp-f-s-17 cdp-tooltip-top cdp-left" title="<?php _e('The copies you created may have been given different titles automatically (according to the rules in <a href="#" class="cdp-go-to-names-chapter">this section</a>) and therefore would not count as duplicates as they have different titles.<br /><br />To remedy this, you can select “Yes” here so that those posts/pages also get considered as duplicates.', 'copy-delete-posts'); ?>" style="line-height: 44px;"><?php _e('When does “yes” make sense here?', 'copy-delete-posts'); ?></span>
  692. </div>
  693. </div>
  694. <!-- <div class="cdp-padding-15-h cdp-f-s-18">
  695. </div> -->
  696. <div class="cdp-cf cdp-p-40-b">
  697. <label class="cdp-left cdp-f-s-18" style="margin-right: 21px;">
  698. <input type="checkbox" name="cdp-d-c-excerpt" class="cdp-d-option" /><?php _e('Excerpt (<span class="cdp-no-empty-text"><b>including</b> empty</span>)', 'copy-delete-posts'); ?>
  699. </label>
  700. <label class="cdp-left cdp-f-s-18" style="margin-right: 90px !important;"><input type="checkbox" name="cdp-d-c-count" class="cdp-d-option"/><?php _e('Word count', 'copy-delete-posts'); ?></label>
  701. <div class="cdp-left cdp-f-s-17" style="line-height: 43px;">
  702. <?php _e('...need others? <a href="mailto:hi@copy-delete-posts.com" target="_blank">Suggest them!</a>', 'copy-delete-posts'); ?>
  703. </div>
  704. </div>
  705. </div>
  706. <div class="cdp-d-option-select-parent cdp-padding-15-h cdp-center cdp-ntp">
  707. <div class="cdp-inline cdp-cf">
  708. <select class="cdp-left cdp-d-option-select cdp-pad-49-list cdp-select-large cdp-max-600 cdp-select cdp-select-centered cdp-sel-separat" name="cdp-d-sels-diftyp">
  709. <option value="1"><?php _e('Only count pages/posts of the same type as duplicates', 'copy-delete-posts'); ?></option>
  710. <option value="2"><?php _e('Also count pages/posts of different types as duplicates', 'copy-delete-posts'); ?></option>
  711. </select>
  712. <span class="cdp-left cdp-green">
  713. <div style="margin-left: 15px; line-height: 51px;">
  714. <span class="cdp-tooltip-top" title='Select the “same type”-option if the pages/posts have to be of the same type (i.e. post / page / specific custom post category) in order to count as duplicates. If you select “cross-type” then pages/posts of different types will also be considered as duplicates.'><?php _e('Huh?', 'copy-delete-posts'); ?></span>
  715. </div>
  716. </span>
  717. </div>
  718. </div>
  719. </div>
  720. <div class="">
  721. <div class="cdp-d-header cdp-f-s-19">
  722. <?php _e('Which version do you want to keep?', 'copy-delete-posts'); ?>
  723. </div>
  724. <div class="cdp-p-30-h cdp-center">
  725. <select class="cdp-d-option-select cdp-pad-49-list cdp-select-large cdp-select cdp-select-centered cdp-sel-separat" name="cdp-d-d-sel-which">
  726. <option value="1"><?php _e('Keep the oldest duplicate (typically the original)', 'copy-delete-posts'); ?></option>
  727. <option value="2"><?php _e('Keep the newest duplicate (typically the last copy you made)', 'copy-delete-posts'); ?></option>
  728. <option value="3"><?php _e('Delete ALL duplicates, don’t keep any (Be careful!)', 'copy-delete-posts'); ?></option>
  729. </select>
  730. </div>
  731. </div>
  732. <div class="cdp-relative cdp-f-s-19">
  733. <span class="cdp-tooltip-premium" data-top="0">
  734. <?php _e('<b>Filter results (optional)</b>: Only list them, if they<span id="cdpp-switch-mf"> […]</span>', 'copy-delete-posts'); ?> <span class="cdp-premium-icon cdp-big-icon"></span>
  735. </span>
  736. </div>
  737. <?php if ($areWePro && function_exists('cdpp_more_filters')) cdpp_more_filters(); ?>
  738. <br />
  739. <div class="cdp-center cdp-p-30-h">
  740. <button class="cdp-button cdp-delete-btn cdp-d-search cdp-rl-round cdp-f-w-bold" type="button" name="button"><?php _e('Scan for duplicates now!<br /><small class="cdp-sm-d cdp-f-s-17 cdp-f-w-medium">(at this point nothing gets deleted)</small>', 'copy-delete-posts'); ?></button>
  741. </div>
  742. </div>
  743. <div class="cdp-padding-15-h">
  744. <div class="cdp-cf cdp-d-pad-sp cdp-not-yet-search" style="display: none; padding-bottom: 30px;">
  745. <div class="cdp-left cdp-f-s-19 cdp-f-w-bold" style="line-height: 41px;">
  746. <?php _e('Scan has found [<span id="cdp-d-table-pagi-ilosc-wynikow" class="cdp-f-w-bold"></span>] duplicates', 'copy-delete-posts'); ?>
  747. </div>
  748. <div class="cdp-right">
  749. <input type="text" class="cdp-d-searchbox-c" name="cdp-d-searchbox" placeholder="Search...">
  750. </div>
  751. <div class="cdp-right cdp-f-s-19" style="padding-right: 45px;">
  752. <div class="cdp-cf" style="line-height: 41px;">
  753. <div class="cdp-left">
  754. <?php _e('Show', 'copy-delete-posts'); ?>
  755. </div>
  756. <select class="cdp-left cdp-select cdp-ow-border cdp-per-page-select-show cdp-width-166">
  757. <option value="5">5</option>
  758. <option value="10">10</option>
  759. <option value="25" selected>25</option>
  760. <option value="40">40</option>
  761. <option value="50">50</option>
  762. <option value="60">60</option>
  763. <option value="75">75</option>
  764. <option value="100">100</option>
  765. </select>
  766. <div class="cdp-left">
  767. <?php _e('per page', 'copy-delete-posts'); ?>
  768. </div>
  769. </div>
  770. </div>
  771. </div>
  772. <!-- DELETION TABLE -->
  773. <div class="cdp-table-cont cdp-not-yet-search" style="display: none;">
  774. <table id="cdp-d-table" class="cdp-delete-table">
  775. <thead>
  776. <tr class="cdp-f-s-19 cdp-f-w-medium">
  777. <th><label><input type="checkbox" class="cdp-d-checkbox-all"/></label></th>
  778. <th><?php _e('Title', 'copy-delete-posts'); ?></th>
  779. <th><?php _e('Slug/URL', 'copy-delete-posts'); ?></th>
  780. <th><?php _e('Type', 'copy-delete-posts'); ?></th>
  781. <th><?php _e('Date created', 'copy-delete-posts'); ?></th>
  782. <th><?php _e('# of words', 'copy-delete-posts'); ?></th>
  783. </tr>
  784. </thead>
  785. <thead>
  786. <tr data-ignore="true"><td class="cdp-h-tbe" colspan="6"></td></tr>
  787. </thead>
  788. <tbody id="cdp-d-table-tbody"></tbody>
  789. <tfoot>
  790. <tr data-ignore="true"><td class="cdp-h-tbe" colspan="6"></td></tr>
  791. </tfoot>
  792. </table>
  793. </div>
  794. <!-- BELOW DELETION TABLE -->
  795. <div class="cdp-d-pad-sp">
  796. <div class="cdp-cf cdp-not-yet-search" style="display: none;">
  797. <div class="cdp-d-sel-all-con cdp-left cdp-f-w-light cdp-f-s-17">
  798. <?php _e('<u class="cdp-d-select-all cdp-f-w-light">Select all</u> (also from other pages)', 'copy-delete-posts'); ?>
  799. </div>
  800. <div class="cdp-center cdp-d-pagi-cent cdp-left">
  801. <div id="cdp-d-table-pagi" class="cdp-pagination"></div>
  802. </div>
  803. </div>
  804. <div class="cdp-center cdp-p-10-h cdp-not-yet-search" style="display: none;">
  805. <div class="cdp-delete-info cdp-f-w-light cdp-f-s-19">
  806. <?php _e('You selected <b class="cdp-t-d-ct cdp-f-w-light">0</b> pages/posts to be deleted', 'copy-delete-posts'); ?>
  807. </div>
  808. </div>
  809. <div class="cdp-p-10-h cdp-not-yet-search" style="display: none;">
  810. <div class="cdp-d-header-2 cdp-f-s-19 cdp-f-w-light">
  811. <?php _e('Steps to deletion:', 'copy-delete-posts'); ?>
  812. </div>
  813. <div class="cdp-margin-left cdp-f-s-19">
  814. <div class="cdp-p-10-h">
  815. <div class="cdp-cf cdp-low-margin-bot" style="line-height: 28px;">
  816. <div class="cdp-left cdp-blue-circle">1</div>
  817. <div class="cdp-left">&nbsp;<?php _e('Make sure you created a backup with, e.g. with <a href="https://wordpress.org/plugins/wp-clone-by-wp-academy/" target="_blank">this plugin</a>.', 'copy-delete-posts'); ?></div>
  818. </div>
  819. <div class="cdp-cf cdp-low-margin-bot" style="line-height: 28px;">
  820. <div class="cdp-left cdp-blue-circle">2</div>
  821. <div class="cdp-left">&nbsp;<?php _e('Select all the posts & pages which should be deleted (by ticking the checkboxes in the table above).', 'copy-delete-posts'); ?></div>
  822. </div>
  823. <div class="cdp-cf cdp-low-margin-bot" style="line-height: 28px;">
  824. <div class="cdp-left cdp-blue-circle">3</div>
  825. <div class="cdp-left">&nbsp;<?php _e('Check if you need these features (optional):', 'copy-delete-posts'); ?></div>
  826. </div>
  827. </div>
  828. <div class="cdp-margin-left-25 cdp-p-20-h cdp-nbp" style="padding-top: 0px">
  829. <table>
  830. <tbody>
  831. <tr>
  832. <td class="cdp-vtop-pad"><?php _e('Automatic redirection', 'copy-delete-posts'); ?></td>
  833. <td>
  834. <div class="cdp-relative">
  835. <span class="cdp-tooltip-premium" style="padding: 25px 0;">
  836. <select class="cdp-p-redirections cdp-select cdp-ow-border cdp-dis-en-opt" name="cdp-redirections">
  837. <option value="0"><?php _e('Disabled', 'copy-delete-posts'); ?></option>
  838. <option value="1"><?php _e('Enabled', 'copy-delete-posts'); ?></option>
  839. </select>
  840. </span>
  841. <div class="cdp-premium-icon cdp-big-icon" style="margin-left: 17px;"></div>
  842. </div>
  843. <div class="cdp-d-tp-pad cdp-f-s-17 cdp-lh-24"><?php _e('Enable this if you want to redirect the urls from your deleted posts/pages to the main one you decided to keep.', 'copy-delete-posts'); ?></div>
  844. </td>
  845. </tr>
  846. <tr>
  847. <td class="cdp-vtop-pad"><?php _e('Deletion throttling', 'copy-delete-posts'); ?></td>
  848. <td>
  849. <div class="cdp-cf">
  850. <select class="cdp-left cdp-d-throttling cdp-select cdp-ow-border cdp-dis-en-opt" name="cdp-throttling">
  851. <option value="0"><?php _e('Disabled', 'copy-delete-posts'); ?></option>
  852. <option value="1"><?php _e('Enabled', 'copy-delete-posts'); ?></option>
  853. </select>
  854. <div class="cdp-left cdp-inline cdp-cf cdp-d-throttling-count-p" style="display: none; line-height: 41px;">
  855. <div class="cdp-left">
  856. <span style="padding: 0px 15px;"><?php _e('Delete', 'copy-delete-posts'); ?></span>
  857. </div>
  858. <div class="cdp-left">
  859. <input type="number" class="cdp-d-throttling-count cdp-number-field-styled" name="cdp-throttling-count" min="1" max="10240" placeholder="50">
  860. </div>
  861. <div class="cdp-left">
  862. <span style="padding: 0px 15px;"><?php _e('per minute', 'copy-delete-posts'); ?></span>
  863. </div>
  864. </div>
  865. </div>
  866. <div class="cdp-d-tp-pad cdp-f-s-17 cdp-lh-24">
  867. <?php _e('Enable this if you want to have your posts/pages getting deleted in batches (instead of all at once).<br />This reduces the risk of timeouts if you have a lot to delete.<br />', 'copy-delete-posts'); ?>
  868. <span class="cdp-even-more-th-info" style="display: none">
  869. <?php _e('If it’s necessary the process will dynamically slow down - depending on your server’s resource consumption. For example, if you’re using another plugin which is running a background process and it takes a lot of resources (+50%), our plugin will wait/slow down until the other process is complete.', 'copy-delete-posts'); ?>
  870. </span>
  871. </div>
  872. </td>
  873. </tr>
  874. <tr>
  875. <td class="cdp-vtop-pad" style="padding-top: 4px"><?php _e('Move post(s) to trash?', 'copy-delete-posts'); ?></td>
  876. <td>
  877. <div class="">
  878. <span class="cdp-tooltip-premium" style="padding: 25px 0">
  879. <label class="cdp-relative" style="padding-right: 25px;"><input type="checkbox" class="cdp-p-just-trash-them" /> <?php _e('Yes, keep deleted posts in trash!', 'copy-delete-posts'); ?> <span class="cdp-premium-icon cdp-big-icon"></span></label>
  880. </span>
  881. <div class="cdp-d-tp-pad cdp-f-s-17 cdp-lh-24"><?php _e('Select this option to move deleted posts to trash (instead of deleting them permanently right away).', 'copy-delete-posts'); ?></div>
  882. </div>
  883. </td>
  884. </tr>
  885. </tbody>
  886. </table>
  887. </div>
  888. </div>
  889. </div>
  890. <div class="">
  891. <div class="cdp-not-yet-search" style="display: none;">
  892. <hr class="cdp-hr">
  893. <div class="cdp-center cdp-padding-15-h cdp-f-s-19">
  894. <label><input type="checkbox" class="cdp-d-just-check-it"> <?php _e('I completed <u>all</u> steps, it’s ok!', 'copy-delete-posts'); ?></label>
  895. </div>
  896. <div class="cdp-center cdp-p-10-h">
  897. <button type="button" class="cdp-button cdp-red-bg cdp-d-real-delete cdp-f-s-19" name="button"><?php _e('Delete selected pages/posts!', 'copy-delete-posts'); ?></button>
  898. </div>
  899. <div class="cdp-center cdp-padding-15-h cdp-f-s-19">
  900. <?php _e('You will be notified when the deletion process ends via <span class="cdp-green">Admin Bar Menu</span>.', 'copy-delete-posts'); ?>
  901. </div>
  902. </div>
  903. <div class="cdp-padding cdp-f-s-17 cdp-center">
  904. <a href="#" class="cdp-close-chapter"><?php _e('Close section', 'copy-delete-posts'); ?></a>
  905. </div>
  906. </div>
  907. </div>
  908. </div>
  909. </div>
  910. </div>
  911. </div>
  912. </div>
  913. <?php if (function_exists('cdpp_license_status')) cdpp_license_status(); ?>
  914. <?php if (function_exists('cdpp_license')) cdpp_license(); ?>
  915. </div>
  916. <div class="cdp-f-s-20 cdp-p-hh cdp-center cdp-relative">
  917. <?php _e('<b>Questions?</b> We\'re happy to help in the <a href="https://wordpress.org/support/plugin/copy-delete-posts/#new-topic-0" target="_blank" style="text-decoration: none;">Support Forum</a>.', 'copy-delete-posts'); ?> <span class="cdp-info-icon cdp-tooltip-top" title="<?php _e('Your account on Wordpress.org (where you open a new support thread) is different to the one you login to your WordPress dashboard (where you are now). If you don\'t have a WordPress.org account yet, please sign up at the top right on here. It only takes a minute :) Thank you!', 'copy-delete-posts'); ?>"></span>
  918. </div>
  919. <jdiv class="label_e50 _bottom_ea7 notranslate" id="cdp_jvlabelWrap-fake" style="background: linear-gradient(95deg, rgb(47, 50, 74) 20%, rgb(66, 72, 103) 80%);right: 30px;bottom: 0px;width: 310px;">
  920. <jdiv class="hoverl_bc6"></jdiv>
  921. <jdiv class="text_468 _noAd_b4d contentTransitionWrap_c73" style="font-size: 15px;font-family: Arial, Arial;font-style: normal;color: rgb(240, 241, 241);position: absolute;top: 8px;line-height: 13px;">
  922. <span><?php _e('Connect with support (click to load)', 'copy-delete-posts'); ?></span><br>
  923. <span style="color: #eee;font-size: 10px;">
  924. <?php _e('This will establish connection to the chat servers', 'copy-delete-posts'); ?>
  925. </span>
  926. </jdiv>
  927. <jdiv class="leafCont_180">
  928. <jdiv class="leaf_2cc _bottom_afb">
  929. <jdiv class="cssLeaf_464"></jdiv>
  930. </jdiv>
  931. </jdiv>
  932. </jdiv>
  933. </div>
  934. </div>
  935. <?php
  936. }
  937. /** –– **/
  938. /** –– **\
  939. * This function will convert bytes to human readable
  940. * @return void
  941. */
  942. function cdp_human_readable_bytes($bytes) {
  943. $label = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
  944. for ($i = 0; $bytes >= 1024 && $i < (count($label) - 1); $bytes /= 1024, $i++);
  945. return (round($bytes, 2) . " " . $label[$i]);
  946. }
  947. /** –– * */
  948. /** –– **\
  949. * Notice about performance.
  950. * @since 1.0.9
  951. */
  952. function cdp_render_performance_notice() {
  953. global $wp_version;
  954. global $wpdb;
  955. $mysqlVersion = $wpdb->db_version();
  956. $cdp_notice2 = __('%b_start%Please%b_end% copy & paste the following log %a_start%into the forum%a_end% so that we can make the plugin better. Thank you!', 'copy-delete-posts');
  957. $cdp_notice2 = str_replace('%a_start%', '<a target="_blank" href="https://wordpress.org/support/plugin/copy-delete-posts/#new-topic-0">', $cdp_notice2);
  958. $cdp_notice2 = str_replace('%a_end%', '</a>', $cdp_notice2);
  959. $cdp_notice2 = str_replace('%b_start%', '<b class="cdp-please-big">', $cdp_notice2);
  960. $cdp_notice2 = str_replace('%b_end%', '</b>', $cdp_notice2);
  961. $logs = get_option('cdp_copy_logs_times', array());
  962. $theLog = '';
  963. $theLog .= 'The OS: ' . PHP_OS . "\n";
  964. $theLog .= 'PHP Version: ' . PHP_VERSION . "\n";
  965. $theLog .= 'WP Version: ' . $wp_version . "\n";
  966. $theLog .= 'MySQL Version: ' . $mysqlVersion . "\n";
  967. $theLog .= 'Directory Separator: ' . DIRECTORY_SEPARATOR . "\n\n";
  968. $theLog .= 'Copy logs:' . "\n";
  969. foreach ($logs as $key => $value) {
  970. $amount = isset($value['amount']) ? $value['amount'] : 1;
  971. $time = $value['time'];
  972. $perOne = $value['perOne'];
  973. $data = date('d-m-Y H:i:s', $value['data']);
  974. $memory = cdp_human_readable_bytes(intval($value['memory']));
  975. $peak = cdp_human_readable_bytes(intval($value['peak']));
  976. $theLog .= $data . ' - ' . $amount . 'x, [total: ' . $time . ', avg: ' . $perOne . '] (mem: ' . $memory . ' - ' . $value['memory'] . ', peak: ' . $peak . ' - ' . $value['peak'] . ')' . "\n";
  977. }
  978. ?>
  979. <div id="cdp_notice_error">
  980. <div class="cdp-cf cdp_notice_heading">
  981. <div class="cdp-left cdp_warning_icon"></div>
  982. <div class="cdp-left cdp_notice_content">
  983. <?php _e('The plugin works, however we noticed some optimization potential on your site.', 'copy-delete-posts'); ?><br>
  984. <?php echo $cdp_notice2; ?>
  985. </div>
  986. <div class="cdp-left cdp_notice_perf_close cdp-tooltip-top" title="<?php _e('Dismiss forever', 'copy-delete-posts'); ?>">&times;</div>
  987. </div>
  988. <div class="cdp-textarea-wr-notice">
  989. <textarea readonly class="cdp_notice_logs"><?php echo $theLog ?></textarea>
  990. <div class="cdp-copy-notice-logs"><?php _e('Copy logs', 'copy-delete-posts'); ?></div>
  991. </div>
  992. </div>
  993. <?php
  994. }
  995. /** –– **/