Browse Source

휘파람보드 1.2.0

- 대규모 업데이트
master
장선근 6 years ago
parent
commit
3ba2edc92b
  1. 104
      _src/admin/js/admin.js
  2. 118
      _src/admin/js/dx.all.js
  3. 285
      _src/admin/js/dx.messages.ko.js
  4. 861
      _src/admin/js/jquery.formatter.js
  5. 2
      _src/admin/js/modules/board.js
  6. 212
      _src/admin/js/modules/datagrid.js
  7. 23
      _src/admin/js/modules/toast.js
  8. 18
      _src/admin/scss/_variables.scss
  9. 18
      _src/admin/scss/admin.scss
  10. 51
      _src/admin/scss/boot/_fonts.scss
  11. 30
      _src/admin/scss/common/_layout.scss
  12. 71
      _src/admin/scss/common/_utility.scss
  13. 2
      _src/admin/scss/components/_buttons.scss
  14. 92
      _src/admin/scss/components/_form.scss
  15. 18
      _src/admin/scss/components/_grid.scss
  16. 4
      _src/admin/scss/components/_label.scss
  17. 37
      _src/admin/scss/plugins/_plugins_custom.scss
  18. 769
      _src/admin/scss/plugins/ax5ui/_ax5grid.scss
  19. 256
      _src/admin/scss/plugins/ax5ui/_ax5toast.scss
  20. 7403
      _src/admin/scss/plugins/devextreme/dx.common.scss
  21. 13343
      _src/admin/scss/plugins/devextreme/dx.light.compact.scss
  22. 23
      _src/admin/scss/plugins/fontawesome5/_rotated-flipped.scss
  23. 21
      _src/admin/scss/plugins/fontawesome5/brands.scss
  24. 16
      _src/admin/scss/plugins/fontawesome5/fontawesome.scss
  25. 22
      _src/admin/scss/plugins/fontawesome5/light.scss
  26. 23
      _src/admin/scss/plugins/fontawesome5/solid.scss
  27. 569
      _src/admin/scss/plugins/jquery.datetimepicker.css
  28. 1
      _src/common/css/global.css
  29. 200
      _src/common/css/toastr.css
  30. 30
      _src/common/js/global.js
  31. 0
      _src/common/js/modules/board.js
  32. 126
      _src/common/js/modules/components.js
  33. 0
      _src/common/js/modules/dropdown.js
  34. 98
      _src/common/js/modules/formatter.js
  35. 0
      _src/common/js/modules/member.js
  36. 194
      _src/common/js/modules/modal.js
  37. 28
      _src/common/js/modules/popup.js
  38. 49
      _src/common/js/modules/regex.js
  39. 288
      _src/common/js/plugins/autosize.js
  40. 5
      _src/common/scss/_function.scss
  41. 33
      _src/common/scss/_mixins.scss
  42. 130
      _src/common/scss/_reset.scss
  43. 98
      _src/common/scss/_utility.scss
  44. 15
      _src/common/scss/global.scss
  45. 0
      _src/common/scss/plugins/_toastr.scss
  46. 0
      _src/common/scss/plugins/ax5ui/_ax5.scss
  47. 0
      _src/common/scss/plugins/ax5ui/_ax5mask.scss
  48. 0
      _src/common/scss/plugins/ax5ui/_ax5modal.scss
  49. 0
      _src/common/scss/plugins/ax5ui/_bourbon_support.scss
  50. 0
      _src/common/scss/plugins/ax5ui/_mixin.scss
  51. 0
      _src/common/scss/plugins/fontawesome5/_animated.scss
  52. 0
      _src/common/scss/plugins/fontawesome5/_bordered-pulled.scss
  53. 0
      _src/common/scss/plugins/fontawesome5/_core.scss
  54. 0
      _src/common/scss/plugins/fontawesome5/_fixed-width.scss
  55. 293
      _src/common/scss/plugins/fontawesome5/_icons.scss
  56. 0
      _src/common/scss/plugins/fontawesome5/_larger.scss
  57. 0
      _src/common/scss/plugins/fontawesome5/_list.scss
  58. 1
      _src/common/scss/plugins/fontawesome5/_mixins.scss
  59. 5
      _src/common/scss/plugins/fontawesome5/_rotated-flipped.scss
  60. 0
      _src/common/scss/plugins/fontawesome5/_screen-reader.scss
  61. 0
      _src/common/scss/plugins/fontawesome5/_shims.scss
  62. 0
      _src/common/scss/plugins/fontawesome5/_stacked.scss
  63. 296
      _src/common/scss/plugins/fontawesome5/_variables.scss
  64. 3
      _src/common/scss/plugins/fontawesome5/brands.scss
  65. 2
      _src/common/scss/plugins/fontawesome5/fontawesome.scss
  66. 3
      _src/common/scss/plugins/fontawesome5/light.scss
  67. 3
      _src/common/scss/plugins/fontawesome5/regular.scss
  68. 3
      _src/common/scss/plugins/fontawesome5/solid.scss
  69. 2
      _src/common/scss/plugins/fontawesome5/v4-shims.scss
  70. 5
      _src/desktop/scss/boot/_function.scss
  71. 56
      _src/desktop/scss/boot/_mixins.scss
  72. 74
      _src/desktop/scss/common/_utility.scss
  73. 10
      _src/desktop/scss/desktop.scss
  74. 20
      _src/desktop/scss/plugins/fontawesome5/_animated.scss
  75. 20
      _src/desktop/scss/plugins/fontawesome5/_bordered-pulled.scss
  76. 20
      _src/desktop/scss/plugins/fontawesome5/_core.scss
  77. 6
      _src/desktop/scss/plugins/fontawesome5/_fixed-width.scss
  78. 1786
      _src/desktop/scss/plugins/fontawesome5/_icons.scss
  79. 23
      _src/desktop/scss/plugins/fontawesome5/_larger.scss
  80. 18
      _src/desktop/scss/plugins/fontawesome5/_list.scss
  81. 57
      _src/desktop/scss/plugins/fontawesome5/_mixins.scss
  82. 5
      _src/desktop/scss/plugins/fontawesome5/_screen-reader.scss
  83. 2062
      _src/desktop/scss/plugins/fontawesome5/_shims.scss
  84. 31
      _src/desktop/scss/plugins/fontawesome5/_stacked.scss
  85. 1800
      _src/desktop/scss/plugins/fontawesome5/_variables.scss
  86. 16
      _src/desktop/scss/plugins/fontawesome5/fontawesome.scss
  87. 22
      _src/desktop/scss/plugins/fontawesome5/light.scss
  88. 22
      _src/desktop/scss/plugins/fontawesome5/regular.scss
  89. 6
      _src/desktop/scss/plugins/fontawesome5/v4-shims.scss
  90. 5
      _src/mobile/scss/boot/_function.scss
  91. 56
      _src/mobile/scss/boot/_mixins.scss
  92. 30
      _src/mobile/scss/common/_utility.scss
  93. 10
      _src/mobile/scss/mobile.scss
  94. 220
      _src/mobile/scss/plugins/_toastr.scss
  95. 20
      _src/mobile/scss/plugins/fontawesome5/_animated.scss
  96. 20
      _src/mobile/scss/plugins/fontawesome5/_bordered-pulled.scss
  97. 20
      _src/mobile/scss/plugins/fontawesome5/_core.scss
  98. 6
      _src/mobile/scss/plugins/fontawesome5/_fixed-width.scss
  99. 1786
      _src/mobile/scss/plugins/fontawesome5/_icons.scss
  100. 23
      _src/mobile/scss/plugins/fontawesome5/_larger.scss

104
_src/admin/js/admin.js

@ -2,37 +2,12 @@
* 관리자 페이지 초기화 * 관리자 페이지 초기화
***********************************************************************************/ ***********************************************************************************/
APP.init = function(){ APP.init = function(){
APP.initAjaxDefaultSetting();
APP.initMenu(); APP.initMenu();
APP.initAx5(); APP.initAx5();
APP.initPlugins(); APP.initPlugins();
APP.initCheckboxAll();
};
APP.initFitHeight();
/***********************************************************************************
* AJAX Error BlockUI 처리
***********************************************************************************/
APP.initAjaxDefaultSetting = function() {
$(document).ajaxError(function(event, request, settings){
var message = '알수없는 오류가 발생하였습니다.';
if( typeof request.responseJSON != 'undefined' && typeof request.responseJSON.message != 'undefined' ) {
message = request.responseJSON.message;
}
else {
if( request.status == 500 ) message = '서버 코드 오류가 발생하였습니다.\n관리자에게 문의하세요';
else if ( request.status == 401 ) message = '해당 명령을 실행할 권한이 없습니다.';
}
toastr.error(message, '오류 발생');
}).ajaxStart(function(){
$.blockUI({
css: {width:'25px',top:'49%',left:'49%',border:'0px none',backgroundColor:'transparent',cursor:'wait'},
message : '<img src="/assets/images/common/ajax-loader.gif" alt="로딩중">',
baseZ : 10000,
overlayCSS : {opacity : 0}
});
}).ajaxComplete(function(){
$.unblockUI();
});
DevExpress.localization.locale('ko');
}; };
/*********************************************************************************** /***********************************************************************************
@ -76,20 +51,26 @@ APP.initPlugins = function() {
showMonthAfterYear: true, showMonthAfterYear: true,
changeMonth: true, changeMonth: true,
changeYear: true, changeYear: true,
yearSuffix: '',
afterShow: function() {
$('.ui-datepicker-prev').empty().append( '<i class="far fa-chevron-left"></i>' );
$('.ui-datepicker-next').empty().append( '<i class="far fa-chevron-right"></i>' );
}
yearSuffix: ''
}; };
$.datepicker.setDefaults($.datepicker.regional['ko']); $.datepicker.setDefaults($.datepicker.regional['ko']);
$('[data-toggle="datepicker"]').each(function(){ $('[data-toggle="datepicker"]').each(function(){
$(this).formatter({
pattern : '{{9999}}-{{99}}-{{99}}',
persistent:true
}).datepicker();
$(this).datepicker();
if( typeof $(this).data('chained-datepicker') != 'undefined' && $(this).data('chained-datepicker') )
{
var el = $(this).data('chained-datepicker'),
$el = $(el);
if($el.length > 0 ) {
$(this).change(function() {
if($el.hasClass('hasDatepicker')) {
$el.datepicker('option', 'minDate', $(this).val() );
}
})
}
}
}); });
$("body").on("click", '[data-toggle="datepicker"]', function(){ $("body").on("click", '[data-toggle="datepicker"]', function(){
@ -99,40 +80,6 @@ APP.initPlugins = function() {
$(this).datepicker("show"); $(this).datepicker("show");
} }
}); });
$('[data-toggle="formatter"]').each(function(){
if( $(this).data('pattern') )
{
$(this).formatter({
pattern : $(this).data('pattern'),
persistent: true
});
}
});
/*
$.datetimepicker.setLocale('kr');
$('[data-toggle="datetimepicker"]').datetimepicker({
format:'Y-m-d H:i'
});
*/
};
APP.initCheckboxAll = function(){
$('[data-checkbox]').click(function(){
var $check = $(this);
var is_all = ($check.data('checkbox-all') && $check.data('checkbox-all').toString() == 'true');
var name = $check.data('checkbox');
var checked = $check.prop('checked');
var $allCheck = is_all ? $check : $('[data-checkbox="'+name+'"][data-checkbox-all="true"]');
if( is_all ) {
$('[data-checkbox="'+name+'"]').prop('checked', checked );
}
else {
$allCheck.prop('checked', $('[data-checkbox="'+name+'"]').not('[data-checkbox-all="true"]').length == $('[data-checkbox="'+name+'"]:checked').not('[data-checkbox-all="true"]').length);
}
});
}; };
/********************************************************************************************************************** /**********************************************************************************************************************
@ -153,10 +100,21 @@ APP.initAx5 = function(){
absolute: true, absolute: true,
iframeLoadingMsg: '<i class="far fa-spinner"></i>' iframeLoadingMsg: '<i class="far fa-spinner"></i>'
}); });
APP.toast = new ax5.ui.toast({
containerPosition: "top-right",
closeIcon: '<i class="far fa-times"></i>'
};
APP.initFitHeight = function() {
$(window).resize(function() {
if($('[data-fit-content]').length> 0 )
{
var mH = $('#contents').height();
$('[data-fit-aside]').each(function() {
mH -= $(this).height();
}); });
$('[data-fit-content]').height(mH);
}
}).resize();
}; };

118
_src/admin/js/dx.all.js
File diff suppressed because it is too large
View File

285
_src/admin/js/dx.messages.ko.js

@ -0,0 +1,285 @@
/*!
* DevExtreme (dx.messages.en.js)
* Version: 19.1.4
* Build date: Mon Jun 17 2019
*
* Copyright (c) 2012 - 2019 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
! function(root, factory) {
if ("function" === typeof define && define.amd) {
define(function(require) {
factory(require("devextreme/localization"))
})
} else {
if ("object" === typeof module && module.exports) {
factory(require("devextreme/localization"))
} else {
factory(DevExpress.localization)
}
}
}(this, function(localization) {
localization.loadMessages({
ko: {
Yes: "확인",
No: "아니오",
Cancel: "취소",
Clear: "초기화",
Done: "완료",
Loading: "불러오는중...",
Select: "선택...",
Search: "검색",
Back: "뒤로가기",
OK: "확인",
"dxCollectionWidget-noDataText": "No data to display",
"validation-required": "Required",
"validation-required-formatted": "{0} is required",
"validation-numeric": "Value must be a number",
"validation-numeric-formatted": "{0} must be a number",
"validation-range": "Value is out of range",
"validation-range-formatted": "{0} is out of range",
"validation-stringLength": "The length of the value is not correct",
"validation-stringLength-formatted": "The length of {0} is not correct",
"validation-custom": "Value is invalid",
"validation-custom-formatted": "{0} is invalid",
"validation-compare": "Values do not match",
"validation-compare-formatted": "{0} does not match",
"validation-pattern": "Value does not match pattern",
"validation-pattern-formatted": "{0} does not match pattern",
"validation-email": "Email is invalid",
"validation-email-formatted": "{0} is invalid",
"validation-mask": "Value is invalid",
"dxLookup-searchPlaceholder": "Minimum character number: {0}",
"dxList-pullingDownText": "Pull down to refresh...",
"dxList-pulledDownText": "Release to refresh...",
"dxList-refreshingText": "Refreshing...",
"dxList-pageLoadingText": "Loading...",
"dxList-nextButtonText": "More",
"dxList-selectAll": "Select All",
"dxListEditDecorator-delete": "Delete",
"dxListEditDecorator-more": "More",
"dxScrollView-pullingDownText": "Pull down to refresh...",
"dxScrollView-pulledDownText": "Release to refresh...",
"dxScrollView-refreshingText": "Refreshing...",
"dxScrollView-reachBottomText": "Loading...",
"dxDateBox-simulatedDataPickerTitleTime": "시간을 선택하세요",
"dxDateBox-simulatedDataPickerTitleDate": "날짜를 선택하세요",
"dxDateBox-simulatedDataPickerTitleDateTime": "날짜와 시간을 선택하세요.",
"dxDateBox-validation-datetime": "올바른 형식의 날짜나 시간 형식이 아닙니다.",
"dxFileUploader-selectFile": "Select file",
"dxFileUploader-dropFile": "or Drop file here",
"dxFileUploader-bytes": "bytes",
"dxFileUploader-kb": "kb",
"dxFileUploader-Mb": "Mb",
"dxFileUploader-Gb": "Gb",
"dxFileUploader-upload": "Upload",
"dxFileUploader-uploaded": "Uploaded",
"dxFileUploader-readyToUpload": "Ready to upload",
"dxFileUploader-uploadFailedMessage": "Upload failed",
"dxFileUploader-invalidFileExtension": "File type is not allowed",
"dxFileUploader-invalidMaxFileSize": "File is too large",
"dxFileUploader-invalidMinFileSize": "File is too small",
"dxRangeSlider-ariaFrom": "From",
"dxRangeSlider-ariaTill": "Till",
"dxSwitch-switchedOnText": "ON",
"dxSwitch-switchedOffText": "OFF",
"dxForm-optionalMark": "optional",
"dxForm-requiredMessage": "{0} is required",
"dxNumberBox-invalidValueMessage": "Value must be a number",
"dxDataGrid-columnChooserTitle": "Column Chooser",
"dxDataGrid-columnChooserEmptyText": "Drag a column here to hide it",
"dxDataGrid-groupContinuesMessage": "Continues on the next page",
"dxDataGrid-groupContinuedMessage": "Continued from the previous page",
"dxDataGrid-groupHeaderText": "Group by This Column",
"dxDataGrid-ungroupHeaderText": "Ungroup",
"dxDataGrid-ungroupAllText": "Ungroup All",
"dxDataGrid-editingEditRow": "Edit",
"dxDataGrid-editingSaveRowChanges": "Save",
"dxDataGrid-editingCancelRowChanges": "Cancel",
"dxDataGrid-editingDeleteRow": "Delete",
"dxDataGrid-editingUndeleteRow": "Undelete",
"dxDataGrid-editingConfirmDeleteMessage": "Are you sure you want to delete this record?",
"dxDataGrid-validationCancelChanges": "Cancel changes",
"dxDataGrid-groupPanelEmptyText": "Drag a column header here to group by that column",
"dxDataGrid-noDataText": "No data",
"dxDataGrid-searchPanelPlaceholder": "Search...",
"dxDataGrid-filterRowShowAllText": "(All)",
"dxDataGrid-filterRowResetOperationText": "Reset",
"dxDataGrid-filterRowOperationEquals": "Equals",
"dxDataGrid-filterRowOperationNotEquals": "Does not equal",
"dxDataGrid-filterRowOperationLess": "Less than",
"dxDataGrid-filterRowOperationLessOrEquals": "Less than or equal to",
"dxDataGrid-filterRowOperationGreater": "Greater than",
"dxDataGrid-filterRowOperationGreaterOrEquals": "Greater than or equal to",
"dxDataGrid-filterRowOperationStartsWith": "Starts with",
"dxDataGrid-filterRowOperationContains": "Contains",
"dxDataGrid-filterRowOperationNotContains": "Does not contain",
"dxDataGrid-filterRowOperationEndsWith": "Ends with",
"dxDataGrid-filterRowOperationBetween": "Between",
"dxDataGrid-filterRowOperationBetweenStartText": "Start",
"dxDataGrid-filterRowOperationBetweenEndText": "End",
"dxDataGrid-applyFilterText": "Apply filter",
"dxDataGrid-trueText": "true",
"dxDataGrid-falseText": "false",
"dxDataGrid-sortingAscendingText": "Sort Ascending",
"dxDataGrid-sortingDescendingText": "Sort Descending",
"dxDataGrid-sortingClearText": "Clear Sorting",
"dxDataGrid-editingSaveAllChanges": "Save changes",
"dxDataGrid-editingCancelAllChanges": "Discard changes",
"dxDataGrid-editingAddRow": "Add a row",
"dxDataGrid-summaryMin": "Min: {0}",
"dxDataGrid-summaryMinOtherColumn": "Min of {1} is {0}",
"dxDataGrid-summaryMax": "Max: {0}",
"dxDataGrid-summaryMaxOtherColumn": "Max of {1} is {0}",
"dxDataGrid-summaryAvg": "Avg: {0}",
"dxDataGrid-summaryAvgOtherColumn": "Avg of {1} is {0}",
"dxDataGrid-summarySum": "Sum: {0}",
"dxDataGrid-summarySumOtherColumn": "Sum of {1} is {0}",
"dxDataGrid-summaryCount": "Count: {0}",
"dxDataGrid-columnFixingFix": "Fix",
"dxDataGrid-columnFixingUnfix": "Unfix",
"dxDataGrid-columnFixingLeftPosition": "To the left",
"dxDataGrid-columnFixingRightPosition": "To the right",
"dxDataGrid-exportTo": "Export",
"dxDataGrid-exportToExcel": "Export to Excel file",
"dxDataGrid-excelFormat": "Excel file",
"dxDataGrid-selectedRows": "Selected rows",
"dxDataGrid-exportSelectedRows": "Export selected rows",
"dxDataGrid-exportAll": "Export all data",
"dxDataGrid-headerFilterEmptyValue": "(Blanks)",
"dxDataGrid-headerFilterOK": "OK",
"dxDataGrid-headerFilterCancel": "Cancel",
"dxDataGrid-ariaColumn": "Column",
"dxDataGrid-ariaValue": "Value",
"dxDataGrid-ariaFilterCell": "Filter cell",
"dxDataGrid-ariaCollapse": "Collapse",
"dxDataGrid-ariaExpand": "Expand",
"dxDataGrid-ariaDataGrid": "Data grid",
"dxDataGrid-ariaSearchInGrid": "Search in data grid",
"dxDataGrid-ariaSelectAll": "Select all",
"dxDataGrid-ariaSelectRow": "Select row",
"dxDataGrid-filterBuilderPopupTitle": "Filter Builder",
"dxDataGrid-filterPanelCreateFilter": "Create Filter",
"dxDataGrid-filterPanelClearFilter": "Clear",
"dxDataGrid-filterPanelFilterEnabledHint": "Enable the filter",
"dxTreeList-ariaTreeList": "Tree list",
"dxTreeList-editingAddRowToNode": "Add",
"dxPager-infoText": "Page {0} of {1} ({2} items)",
"dxPager-pagesCountText": "of",
"dxPivotGrid-grandTotal": "Grand Total",
"dxPivotGrid-total": "{0} Total",
"dxPivotGrid-fieldChooserTitle": "Field Chooser",
"dxPivotGrid-showFieldChooser": "Show Field Chooser",
"dxPivotGrid-expandAll": "Expand All",
"dxPivotGrid-collapseAll": "Collapse All",
"dxPivotGrid-sortColumnBySummary": 'Sort "{0}" by This Column',
"dxPivotGrid-sortRowBySummary": 'Sort "{0}" by This Row',
"dxPivotGrid-removeAllSorting": "Remove All Sorting",
"dxPivotGrid-dataNotAvailable": "N/A",
"dxPivotGrid-rowFields": "Row Fields",
"dxPivotGrid-columnFields": "Column Fields",
"dxPivotGrid-dataFields": "Data Fields",
"dxPivotGrid-filterFields": "Filter Fields",
"dxPivotGrid-allFields": "All Fields",
"dxPivotGrid-columnFieldArea": "Drop Column Fields Here",
"dxPivotGrid-dataFieldArea": "Drop Data Fields Here",
"dxPivotGrid-rowFieldArea": "Drop Row Fields Here",
"dxPivotGrid-filterFieldArea": "Drop Filter Fields Here",
"dxScheduler-editorLabelTitle": "Subject",
"dxScheduler-editorLabelStartDate": "Start Date",
"dxScheduler-editorLabelEndDate": "End Date",
"dxScheduler-editorLabelDescription": "Description",
"dxScheduler-editorLabelRecurrence": "Repeat",
"dxScheduler-openAppointment": "Open appointment",
"dxScheduler-recurrenceNever": "Never",
"dxScheduler-recurrenceDaily": "Daily",
"dxScheduler-recurrenceWeekly": "Weekly",
"dxScheduler-recurrenceMonthly": "Monthly",
"dxScheduler-recurrenceYearly": "Yearly",
"dxScheduler-recurrenceRepeatEvery": "Repeat Every",
"dxScheduler-recurrenceRepeatOn": "Repeat On",
"dxScheduler-recurrenceEnd": "End repeat",
"dxScheduler-recurrenceAfter": "After",
"dxScheduler-recurrenceOn": "On",
"dxScheduler-recurrenceRepeatDaily": "day(s)",
"dxScheduler-recurrenceRepeatWeekly": "week(s)",
"dxScheduler-recurrenceRepeatMonthly": "month(s)",
"dxScheduler-recurrenceRepeatYearly": "year(s)",
"dxScheduler-switcherDay": "Day",
"dxScheduler-switcherWeek": "Week",
"dxScheduler-switcherWorkWeek": "Work Week",
"dxScheduler-switcherMonth": "Month",
"dxScheduler-switcherAgenda": "Agenda",
"dxScheduler-switcherTimelineDay": "Timeline Day",
"dxScheduler-switcherTimelineWeek": "Timeline Week",
"dxScheduler-switcherTimelineWorkWeek": "Timeline Work Week",
"dxScheduler-switcherTimelineMonth": "Timeline Month",
"dxScheduler-recurrenceRepeatOnDate": "on date",
"dxScheduler-recurrenceRepeatCount": "occurrence(s)",
"dxScheduler-allDay": "All day",
"dxScheduler-confirmRecurrenceEditMessage": "Do you want to edit only this appointment or the whole series?",
"dxScheduler-confirmRecurrenceDeleteMessage": "Do you want to delete only this appointment or the whole series?",
"dxScheduler-confirmRecurrenceEditSeries": "Edit series",
"dxScheduler-confirmRecurrenceDeleteSeries": "Delete series",
"dxScheduler-confirmRecurrenceEditOccurrence": "Edit appointment",
"dxScheduler-confirmRecurrenceDeleteOccurrence": "Delete appointment",
"dxScheduler-noTimezoneTitle": "No timezone",
"dxScheduler-moreAppointments": "{0} more",
"dxCalendar-todayButtonText": "오늘",
"dxCalendar-ariaWidgetName": "달력",
"dxColorView-ariaRed": "Red",
"dxColorView-ariaGreen": "Green",
"dxColorView-ariaBlue": "Blue",
"dxColorView-ariaAlpha": "Transparency",
"dxColorView-ariaHex": "Color code",
"dxTagBox-selected": "{0} selected",
"dxTagBox-allSelected": "All selected ({0})",
"dxTagBox-moreSelected": "{0} more",
"vizExport-printingButtonText": "Print",
"vizExport-titleMenuText": "Exporting/Printing",
"vizExport-exportButtonText": "{0} file",
"dxFilterBuilder-and": "And",
"dxFilterBuilder-or": "Or",
"dxFilterBuilder-notAnd": "Not And",
"dxFilterBuilder-notOr": "Not Or",
"dxFilterBuilder-addCondition": "Add Condition",
"dxFilterBuilder-addGroup": "Add Group",
"dxFilterBuilder-enterValueText": "<enter a value>",
"dxFilterBuilder-filterOperationEquals": "Equals",
"dxFilterBuilder-filterOperationNotEquals": "Does not equal",
"dxFilterBuilder-filterOperationLess": "Is less than",
"dxFilterBuilder-filterOperationLessOrEquals": "Is less than or equal to",
"dxFilterBuilder-filterOperationGreater": "Is greater than",
"dxFilterBuilder-filterOperationGreaterOrEquals": "Is greater than or equal to",
"dxFilterBuilder-filterOperationStartsWith": "Starts with",
"dxFilterBuilder-filterOperationContains": "Contains",
"dxFilterBuilder-filterOperationNotContains": "Does not contain",
"dxFilterBuilder-filterOperationEndsWith": "Ends with",
"dxFilterBuilder-filterOperationIsBlank": "Is blank",
"dxFilterBuilder-filterOperationIsNotBlank": "Is not blank",
"dxFilterBuilder-filterOperationBetween": "Is between",
"dxFilterBuilder-filterOperationAnyOf": "Is any of",
"dxFilterBuilder-filterOperationNoneOf": "Is none of",
"dxHtmlEditor-dialogColorCaption": "Change Font Color",
"dxHtmlEditor-dialogBackgroundCaption": "Change Background Color",
"dxHtmlEditor-dialogLinkCaption": "Add Link",
"dxHtmlEditor-dialogLinkUrlField": "URL",
"dxHtmlEditor-dialogLinkTextField": "Text",
"dxHtmlEditor-dialogLinkTargetField": "Open link in new window",
"dxHtmlEditor-dialogImageCaption": "Add Image",
"dxHtmlEditor-dialogImageUrlField": "URL",
"dxHtmlEditor-dialogImageAltField": "Alternate text",
"dxHtmlEditor-dialogImageWidthField": "Width (px)",
"dxHtmlEditor-dialogImageHeightField": "Height (px)",
"dxHtmlEditor-heading": "Heading",
"dxHtmlEditor-normalText": "Normal text",
"dxFileManager-errorNoAccess": "Access denied. The operation cannot be completed.",
"dxFileManager-errorDirectoryExistsFormat": "Directory '{0}' already exists.",
"dxFileManager-errorFileExistsFormat": "File '{0}' already exists.",
"dxFileManager-errorFileNotFoundFormat": "File '{0}' not found",
"dxFileManager-errorDefault": "Unspecified error."
}
})
});

861
_src/admin/js/jquery.formatter.js

@ -1,861 +0,0 @@
/*!
* v0.1.5
* Copyright (c) 2014 First Opinion
* formatter.js is open sourced under the MIT license.
*
* thanks to digitalBush/jquery.maskedinput for some of the trickier
* keycode handling
*/
//
// Uses CommonJS, AMD or browser globals to create a jQuery plugin.
//
// Similar to jqueryPlugin.js but also tries to
// work in a CommonJS environment.
// It is unlikely jQuery will run in a CommonJS
// environment. See jqueryPlugin.js if you do
// not want to add the extra CommonJS detection.
//
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jQuery'], factory);
} else if (typeof exports === 'object') {
factory(require('jQuery'));
} else {
// Browser globals
factory(root.jQuery);
}
}(this, function (jQuery) {
/*
* pattern.js
*
* Utilities to parse str pattern and return info
*
*/
var pattern = function () {
// Define module
var pattern = {};
// Match information
var DELIM_SIZE = 4;
// Our regex used to parse
var regexp = new RegExp('{{([^}]+)}}', 'g');
//
// Helper method to parse pattern str
//
var getMatches = function (pattern) {
// Populate array of matches
var matches = [], match;
while (match = regexp.exec(pattern)) {
matches.push(match);
}
return matches;
};
//
// Create an object holding all formatted characters
// with corresponding positions
//
pattern.parse = function (pattern) {
// Our obj to populate
var info = {
inpts: {},
chars: {}
};
// Pattern information
var matches = getMatches(pattern), pLength = pattern.length;
// Counters
var mCount = 0, iCount = 0, i = 0;
// Add inpts, move to end of match, and process
var processMatch = function (val) {
var valLength = val.length;
for (var j = 0; j < valLength; j++) {
info.inpts[iCount] = val.charAt(j);
iCount++;
}
mCount++;
i += val.length + DELIM_SIZE - 1;
};
// Process match or add chars
for (i; i < pLength; i++) {
if (mCount < matches.length && i === matches[mCount].index) {
processMatch(matches[mCount][1]);
} else {
info.chars[i - mCount * DELIM_SIZE] = pattern.charAt(i);
}
}
// Set mLength and return
info.mLength = i - mCount * DELIM_SIZE;
return info;
};
// Expose
return pattern;
}();
/*
* utils.js
*
* Independent helper methods (cross browser, etc..)
*
*/
var utils = function () {
// Define module
var utils = {};
// Useragent info for keycode handling
var uAgent = typeof navigator !== 'undefined' ? navigator.userAgent : null;
//
// Shallow copy properties from n objects to destObj
//
utils.extend = function (destObj) {
for (var i = 1; i < arguments.length; i++) {
for (var key in arguments[i]) {
destObj[key] = arguments[i][key];
}
}
return destObj;
};
//
// Add a given character to a string at a defined pos
//
utils.addChars = function (str, chars, pos) {
return str.substr(0, pos) + chars + str.substr(pos, str.length);
};
//
// Remove a span of characters
//
utils.removeChars = function (str, start, end) {
return str.substr(0, start) + str.substr(end, str.length);
};
//
// Return true/false is num false between bounds
//
utils.isBetween = function (num, bounds) {
bounds.sort(function (a, b) {
return a - b;
});
return num > bounds[0] && num < bounds[1];
};
//
// Helper method for cross browser event listeners
//
utils.addListener = function (el, evt, handler) {
return typeof el.addEventListener !== 'undefined' ? el.addEventListener(evt, handler, false) : el.attachEvent('on' + evt, handler);
};
//
// Helper method for cross browser implementation of preventDefault
//
utils.preventDefault = function (evt) {
return evt.preventDefault ? evt.preventDefault() : evt.returnValue = false;
};
//
// Helper method for cross browser implementation for grabbing
// clipboard data
//
utils.getClip = function (evt) {
if (evt.clipboardData) {
return evt.clipboardData.getData('Text');
}
if (window.clipboardData) {
return window.clipboardData.getData('Text');
}
};
//
// Loop over object and checking for matching properties
//
utils.getMatchingKey = function (which, keyCode, keys) {
// Loop over and return if matched.
for (var k in keys) {
var key = keys[k];
if (which === key.which && keyCode === key.keyCode) {
return k;
}
}
};
//
// Returns true/false if k is a del keyDown
//
utils.isDelKeyDown = function (which, keyCode) {
var keys = {
'backspace': {
'which': 8,
'keyCode': 8
},
'delete': {
'which': 46,
'keyCode': 46
}
};
return utils.getMatchingKey(which, keyCode, keys);
};
//
// Returns true/false if k is a del keyPress
//
utils.isDelKeyPress = function (which, keyCode) {
var keys = {
'backspace': {
'which': 8,
'keyCode': 8,
'shiftKey': false
},
'delete': {
'which': 0,
'keyCode': 46
}
};
return utils.getMatchingKey(which, keyCode, keys);
};
// //
// // Determine if keydown relates to specialKey
// //
// utils.isSpecialKeyDown = function (which, keyCode) {
// var keys = {
// 'tab': { 'which': 9, 'keyCode': 9 },
// 'enter': { 'which': 13, 'keyCode': 13 },
// 'end': { 'which': 35, 'keyCode': 35 },
// 'home': { 'which': 36, 'keyCode': 36 },
// 'leftarrow': { 'which': 37, 'keyCode': 37 },
// 'uparrow': { 'which': 38, 'keyCode': 38 },
// 'rightarrow': { 'which': 39, 'keyCode': 39 },
// 'downarrow': { 'which': 40, 'keyCode': 40 },
// 'F5': { 'which': 116, 'keyCode': 116 }
// };
// return utils.getMatchingKey(which, keyCode, keys);
// };
//
// Determine if keypress relates to specialKey
//
utils.isSpecialKeyPress = function (which, keyCode) {
var keys = {
'tab': {
'which': 0,
'keyCode': 9
},
'enter': {
'which': 13,
'keyCode': 13
},
'end': {
'which': 0,
'keyCode': 35
},
'home': {
'which': 0,
'keyCode': 36
},
'leftarrow': {
'which': 0,
'keyCode': 37
},
'uparrow': {
'which': 0,
'keyCode': 38
},
'rightarrow': {
'which': 0,
'keyCode': 39
},
'downarrow': {
'which': 0,
'keyCode': 40
},
'F5': {
'which': 116,
'keyCode': 116
}
};
return utils.getMatchingKey(which, keyCode, keys);
};
//
// Returns true/false if modifier key is held down
//
utils.isModifier = function (evt) {
return evt.ctrlKey || evt.altKey || evt.metaKey;
};
//
// Iterates over each property of object or array.
//
utils.forEach = function (collection, callback, thisArg) {
if (collection.hasOwnProperty('length')) {
for (var index = 0, len = collection.length; index < len; index++) {
if (callback.call(thisArg, collection[index], index, collection) === false) {
break;
}
}
} else {
for (var key in collection) {
if (collection.hasOwnProperty(key)) {
if (callback.call(thisArg, collection[key], key, collection) === false) {
break;
}
}
}
}
};
// Expose
return utils;
}();
/*
* pattern-matcher.js
*
* Parses a pattern specification and determines appropriate pattern for an
* input string
*
*/
var patternMatcher = function (pattern, utils) {
//
// Parse a matcher string into a RegExp. Accepts valid regular
// expressions and the catchall '*'.
// @private
//
var parseMatcher = function (matcher) {
if (matcher === '*') {
return /.*/;
}
return new RegExp(matcher);
};
//
// Parse a pattern spec and return a function that returns a pattern
// based on user input. The first matching pattern will be chosen.
// Pattern spec format:
// Array [
// Object: { Matcher(RegExp String) : Pattern(Pattern String) },
// ...
// ]
function patternMatcher(patternSpec) {
var matchers = [], patterns = [];
// Iterate over each pattern in order.
utils.forEach(patternSpec, function (patternMatcher) {
// Process single property object to obtain pattern and matcher.
utils.forEach(patternMatcher, function (patternStr, matcherStr) {
var parsedPattern = pattern.parse(patternStr), regExpMatcher = parseMatcher(matcherStr);
matchers.push(regExpMatcher);
patterns.push(parsedPattern);
// Stop after one iteration.
return false;
});
});
var getPattern = function (input) {
var matchedIndex;
utils.forEach(matchers, function (matcher, index) {
if (matcher.test(input)) {
matchedIndex = index;
return false;
}
});
return matchedIndex === undefined ? null : patterns[matchedIndex];
};
return {
getPattern: getPattern,
patterns: patterns,
matchers: matchers
};
}
// Expose
return patternMatcher;
}(pattern, utils);
/*
* inpt-sel.js
*
* Cross browser implementation to get and set input selections
*
*/
var inptSel = function () {
// Define module
var inptSel = {};
//
// Get begin and end positions of selected input. Return 0's
// if there is no selectiion data
//
inptSel.get = function (el) {
// If normal browser return with result
if (typeof el.selectionStart === 'number') {
return {
begin: el.selectionStart,
end: el.selectionEnd
};
}
// Uh-Oh. We must be IE. Fun with TextRange!!
var range = document.selection.createRange();
// Determine if there is a selection
if (range && range.parentElement() === el) {
var inputRange = el.createTextRange(), endRange = el.createTextRange(), length = el.value.length;
// Create a working TextRange for the input selection
inputRange.moveToBookmark(range.getBookmark());
// Move endRange begin pos to end pos (hence endRange)
endRange.collapse(false);
// If we are at the very end of the input, begin and end
// must both be the length of the el.value
if (inputRange.compareEndPoints('StartToEnd', endRange) > -1) {
return {
begin: length,
end: length
};
}
// Note: moveStart usually returns the units moved, which
// one may think is -length, however, it will stop when it
// gets to the begin of the range, thus giving us the
// negative value of the pos.
return {
begin: -inputRange.moveStart('character', -length),
end: -inputRange.moveEnd('character', -length)
};
}
//Return 0's on no selection data
return {
begin: 0,
end: 0
};
};
//
// Set the caret position at a specified location
//
inptSel.set = function (el, pos) {
// Normalize pos
if (typeof pos !== 'object') {
pos = {
begin: pos,
end: pos
};
}
// If normal browser
if (el.setSelectionRange) {
el.focus();
el.setSelectionRange(pos.begin, pos.end);
} else if (el.createTextRange) {
var range = el.createTextRange();
range.collapse(true);
range.moveEnd('character', pos.end);
range.moveStart('character', pos.begin);
range.select();
}
};
// Expose
return inptSel;
}();
/*
* formatter.js
*
* Class used to format input based on passed pattern
*
*/
var formatter = function (patternMatcher, inptSel, utils) {
// Defaults
var defaults = {
persistent: false,
repeat: false,
placeholder: ' '
};
// Regexs for input validation
var inptRegs = {
'9': /[0-9]/,
'a': /[A-Za-z]/,
'*': /[A-Za-z0-9]/
};
//
// Class Constructor - Called with new Formatter(el, opts)
// Responsible for setting up required instance variables, and
// attaching the event listener to the element.
//
function Formatter(el, opts) {
// Cache this
var self = this;
// Make sure we have an element. Make accesible to instance
self.el = el;
if (!self.el) {
throw new TypeError('Must provide an existing element');
}
// Merge opts with defaults
self.opts = utils.extend({}, defaults, opts);
// 1 pattern is special case
if (typeof self.opts.pattern !== 'undefined') {
self.opts.patterns = self._specFromSinglePattern(self.opts.pattern);
delete self.opts.pattern;
}
// Make sure we have valid opts
if (typeof self.opts.patterns === 'undefined') {
throw new TypeError('Must provide a pattern or array of patterns');
}
self.patternMatcher = patternMatcher(self.opts.patterns);
// Upate pattern with initial value
self._updatePattern();
// Init values
self.hldrs = {};
self.focus = 0;
// Add Listeners
utils.addListener(self.el, 'keydown', function (evt) {
self._keyDown(evt);
});
utils.addListener(self.el, 'keypress', function (evt) {
self._keyPress(evt);
});
utils.addListener(self.el, 'paste', function (evt) {
self._paste(evt);
});
// Persistence
if (self.opts.persistent) {
// Format on start
self._processKey('', false);
self.el.blur();
// Add Listeners
utils.addListener(self.el, 'focus', function (evt) {
self._focus(evt);
});
utils.addListener(self.el, 'click', function (evt) {
self._focus(evt);
});
utils.addListener(self.el, 'touchstart', function (evt) {
self._focus(evt);
});
}
}
//
// @public
// Add new char
//
Formatter.addInptType = function (chr, reg) {
inptRegs[chr] = reg;
};
//
// @public
// Apply the given pattern to the current input without moving caret.
//
Formatter.prototype.resetPattern = function (str) {
// Update opts to hold new pattern
this.opts.patterns = str ? this._specFromSinglePattern(str) : this.opts.patterns;
// Get current state
this.sel = inptSel.get(this.el);
this.val = this.el.value;
// Init values
this.delta = 0;
// Remove all formatted chars from val
this._removeChars();
this.patternMatcher = patternMatcher(this.opts.patterns);
// Update pattern
var newPattern = this.patternMatcher.getPattern(this.val);
this.mLength = newPattern.mLength;
this.chars = newPattern.chars;
this.inpts = newPattern.inpts;
// Format on start
this._processKey('', false, true);
};
//
// @private
// Determine correct format pattern based on input val
//
Formatter.prototype._updatePattern = function () {
// Determine appropriate pattern
var newPattern = this.patternMatcher.getPattern(this.val);
// Only update the pattern if there is an appropriate pattern for the value.
// Otherwise, leave the current pattern (and likely delete the latest character.)
if (newPattern) {
// Get info about the given pattern
this.mLength = newPattern.mLength;
this.chars = newPattern.chars;
this.inpts = newPattern.inpts;
}
};
//
// @private
// Handler called on all keyDown strokes. All keys trigger
// this handler. Only process delete keys.
//
Formatter.prototype._keyDown = function (evt) {
// The first thing we need is the character code
var k = evt.which || evt.keyCode;
// If delete key
if (k && utils.isDelKeyDown(evt.which, evt.keyCode)) {
// Process the keyCode and prevent default
this._processKey(null, k);
return utils.preventDefault(evt);
}
};
//
// @private
// Handler called on all keyPress strokes. Only processes
// character keys (as long as no modifier key is in use).
//
Formatter.prototype._keyPress = function (evt) {
// The first thing we need is the character code
var k, isSpecial;
// Mozilla will trigger on special keys and assign the the value 0
// We want to use that 0 rather than the keyCode it assigns.
k = evt.which || evt.keyCode;
isSpecial = utils.isSpecialKeyPress(evt.which, evt.keyCode);
// Process the keyCode and prevent default
if (!utils.isDelKeyPress(evt.which, evt.keyCode) && !isSpecial && !utils.isModifier(evt)) {
this._processKey(String.fromCharCode(k), false);
return utils.preventDefault(evt);
}
};
//
// @private
// Handler called on paste event.
//
Formatter.prototype._paste = function (evt) {
// Process the clipboard paste and prevent default
this._processKey(utils.getClip(evt), false);
return utils.preventDefault(evt);
};
//
// @private
// Handle called on focus event.
//
Formatter.prototype._focus = function () {
// Wrapped in timeout so that we can grab input selection
var self = this;
setTimeout(function () {
// Grab selection
var selection = inptSel.get(self.el);
// Char check
var isAfterStart = selection.end > self.focus, isFirstChar = selection.end === 0;
// If clicked in front of start, refocus to start
if (isAfterStart || isFirstChar) {
inptSel.set(self.el, self.focus);
}
}, 0);
};
//
// @private
// Using the provided key information, alter el value.
//
Formatter.prototype._processKey = function (chars, delKey, ignoreCaret) {
// Get current state
this.sel = inptSel.get(this.el);
this.val = this.el.value;
// Init values
this.delta = 0;
// If chars were highlighted, we need to remove them
if (this.sel.begin !== this.sel.end) {
this.delta = -1 * Math.abs(this.sel.begin - this.sel.end);
this.val = utils.removeChars(this.val, this.sel.begin, this.sel.end);
} else if (delKey && delKey === 46) {
this._delete();
} else if (delKey && this.sel.begin - 1 >= 0) {
// Always have a delta of at least -1 for the character being deleted.
this.val = utils.removeChars(this.val, this.sel.end - 1, this.sel.end);
this.delta -= 1;
} else if (delKey) {
return true;
}
// If the key is not a del key, it should convert to a str
if (!delKey) {
// Add char at position and increment delta
this.val = utils.addChars(this.val, chars, this.sel.begin);
this.delta += chars.length;
}
// Format el.value (also handles updating caret position)
this._formatValue(ignoreCaret);
};
//
// @private
// Deletes the character in front of it
//
Formatter.prototype._delete = function () {
// Adjust focus to make sure its not on a formatted char
while (this.chars[this.sel.begin]) {
this._nextPos();
}
// As long as we are not at the end
if (this.sel.begin < this.val.length) {
// We will simulate a delete by moving the caret to the next char
// and then deleting
this._nextPos();
this.val = utils.removeChars(this.val, this.sel.end - 1, this.sel.end);
this.delta = -1;
}
};
//
// @private
// Quick helper method to move the caret to the next pos
//
Formatter.prototype._nextPos = function () {
this.sel.end++;
this.sel.begin++;
};
//
// @private
// Alter element value to display characters matching the provided
// instance pattern. Also responsible for updating
//
Formatter.prototype._formatValue = function (ignoreCaret) {
// Set caret pos
this.newPos = this.sel.end + this.delta;
// Remove all formatted chars from val
this._removeChars();
// Switch to first matching pattern based on val
this._updatePattern();
// Validate inputs
this._validateInpts();
// Add formatted characters
this._addChars();
// Set value and adhere to maxLength
this.el.value = this.val.substr(0, this.mLength);
// Set new caret position
if (typeof ignoreCaret === 'undefined' || ignoreCaret === false) {
inptSel.set(this.el, this.newPos);
}
};
//
// @private
// Remove all formatted before and after a specified pos
//
Formatter.prototype._removeChars = function () {
// Delta shouldn't include placeholders
if (this.sel.end > this.focus) {
this.delta += this.sel.end - this.focus;
}
// Account for shifts during removal
var shift = 0;
// Loop through all possible char positions
for (var i = 0; i <= this.mLength; i++) {
// Get transformed position
var curChar = this.chars[i], curHldr = this.hldrs[i], pos = i + shift, val;
// If after selection we need to account for delta
pos = i >= this.sel.begin ? pos + this.delta : pos;
val = this.val.charAt(pos);
// Remove char and account for shift
if (curChar && curChar === val || curHldr && curHldr === val) {
this.val = utils.removeChars(this.val, pos, pos + 1);
shift--;
}
}
// All hldrs should be removed now
this.hldrs = {};
// Set focus to last character
this.focus = this.val.length;
};
//
// @private
// Make sure all inpts are valid, else remove and update delta
//
Formatter.prototype._validateInpts = function () {
// Loop over each char and validate
for (var i = 0; i < this.val.length; i++) {
// Get char inpt type
var inptType = this.inpts[i];
// Checks
var isBadType = !inptRegs[inptType], isInvalid = !isBadType && !inptRegs[inptType].test(this.val.charAt(i)), inBounds = this.inpts[i];
// Remove if incorrect and inbounds
if ((isBadType || isInvalid) && inBounds) {
this.val = utils.removeChars(this.val, i, i + 1);
this.focusStart--;
this.newPos--;
this.delta--;
i--;
}
}
};
//
// @private
// Loop over val and add formatted chars as necessary
//
Formatter.prototype._addChars = function () {
if (this.opts.persistent) {
// Loop over all possible characters
for (var i = 0; i <= this.mLength; i++) {
if (!this.val.charAt(i)) {
// Add placeholder at pos
this.val = utils.addChars(this.val, this.opts.placeholder, i);
this.hldrs[i] = this.opts.placeholder;
}
this._addChar(i);
}
// Adjust focus to make sure its not on a formatted char
while (this.chars[this.focus]) {
this.focus++;
}
} else {
// Avoid caching val.length, as they may change in _addChar.
for (var j = 0; j <= this.val.length; j++) {
// When moving backwards there are some race conditions where we
// dont want to add the character
if (this.delta <= 0 && j === this.focus) {
return true;
}
// Place character in current position of the formatted string.
this._addChar(j);
}
}
};
//
// @private
// Add formattted char at position
//
Formatter.prototype._addChar = function (i) {
// If char exists at position
var chr = this.chars[i];
if (!chr) {
return true;
}
// If chars are added in between the old pos and new pos
// we need to increment pos and delta
if (utils.isBetween(i, [
this.sel.begin - 1,
this.newPos + 1
])) {
this.newPos++;
this.delta++;
}
// If character added before focus, incr
if (i <= this.focus) {
this.focus++;
}
// Updateholder
if (this.hldrs[i]) {
delete this.hldrs[i];
this.hldrs[i + 1] = this.opts.placeholder;
}
// Update value
this.val = utils.addChars(this.val, chr, i);
};
//
// @private
// Create a patternSpec for passing into patternMatcher that
// has exactly one catch all pattern.
//
Formatter.prototype._specFromSinglePattern = function (patternStr) {
return [{ '*': patternStr }];
};
// Expose
return Formatter;
}(patternMatcher, inptSel, utils);
// A really lightweight plugin wrapper around the constructor,
// preventing against multiple instantiations
var pluginName = 'formatter';
$.fn[pluginName] = function (options) {
// Initiate plugin if options passed
if (typeof options == 'object') {
this.each(function () {
if (!$.data(this, 'plugin_' + pluginName)) {
$.data(this, 'plugin_' + pluginName,
new formatter(this, options));
}
});
}
// Add resetPattern method to plugin
this.resetPattern = function (str) {
this.each(function () {
var formatted = $.data(this, 'plugin_' + pluginName);
// resetPattern for instance
if (formatted) { formatted.resetPattern(str); }
});
// Chainable please
return this;
};
// Chainable please
return this;
};
$.fn[pluginName].addInptType = function (chr, regexp) {
formatter.addInptType(chr, regexp);
};
}));

2
_src/admin/js/modules/board.js

@ -1,6 +1,6 @@
APP.BOARD.keyCheck = function(value) { APP.BOARD.keyCheck = function(value) {
if (value == '') return "게시판 고유키를 입력하세요"; if (value == '') return "게시판 고유키를 입력하세요";
if (!APP.REGEX.uniqueID.test(value)) return "게시판 고유키는 영어 소문자로 시작하는 3~20 글자로 영어와 숫자만 사용가능합니다.";
if (!value.regex('uniqid')) return "게시판 고유키는 영어 소문자로 시작하는 3~20 글자로 영어와 숫자만 사용가능합니다.";
if (APP.BOARD.existCheck(value)) return "이미 존재하는 키 입니다."; if (APP.BOARD.existCheck(value)) return "이미 존재하는 키 입니다.";
return true; return true;

212
_src/admin/js/modules/datagrid.js

@ -0,0 +1,212 @@
/**
* GRID Element 생성자
* @param element
* @param options
* @constructor
*/
function GRID (element, addOptions) {
this.element = element;
var self = this;
this.defaultOptions = {
key : null,
cacheEnabled: false,
statusField : {
key : '',
values : []
},
colorField : [],
loadPanel: { enabled: true },
remoteOperations: {
groupPaging: true,
sorting:true,
paging:true
},
paging: {
pageSize: 30,
showNavigationButtons: true
},
selection : {
mode: 'single',
selectAllMode : 'page'
},
scrolling: {
showScrollbar: 'onHover'
},
focusedRowEnabled: true,
columns: null,
dataSource: null,
showRowLines:true,
showColumnLines:true,
allowColumnResizing: true,
noDataText: '검색된 데이타가 없습니다.',
allowColumnReordering: true,
columnResizingMode: 'widget',
editing: {
allowUpdating: false,
allowAdding: false,
allowDeleting: false
},
onRowClick: function(e) {
self.OnRowSingleClick(e.data);
},
onRowDblClick: function(e) {
self.OnRowDoubleClick(e.data);
},
onRowPrepared: function(e) {
if(e.rowType == 'data') {
var k = self.options.statusField.key,
v = self.options.statusField.values,
t = typeof v;
if( k && ( (t == 'string' && v) || (t == 'object' && v.length > 0)) ) {
if( (t == 'string' && e.data[k] == v) || (t == 'object' && $.inArray( e.data[k], v) > -1) ) {
e.rowElement.addClass('unused');
}
}
self.OnRowPrepared(e);
}
},
onContextMenuPreparing: function(e) {
if(e.rowType == 'data') self.OnContextMenuPreparing(e);
},
onSelectionChanged:function(e) {
self.OnSelectionChanged(e);
},
onCellPrepared: function(e) {
if(e.rowType == 'data') {
if(typeof self.options.colorField == 'object' && self.options.colorField.length > 0)
{
for(var i in self.options.colorField) {
if( self.options.colorField[i].key && self.options.colorField[i].color && e.column.dataField == self.options.colorField[i].key ) {
e.cellElement.css("background-color", self.options.colorField[i].color);
}
}
}
self.OnCellPrepared(e);
}
}
};
this.options = $.extend({}, this.defaultOptions, addOptions);
}
GRID.prototype.instance = function() {
return $(this.element).dxDataGrid('instance');
}
/**
* 그리드를 초기화한다.
*/
GRID.prototype.init = function() {
// 그리드 초기화
$(this.element).dxDataGrid(this.options);
var that = this;
if( $('[data-column]').length > 0 ) {
$('[data-column]').change(function(e) {
var field = $(this).data('column'),
visible = $(this).prop('checked');
$(that.element).dxDataGrid('columnOption', field, 'visible', visible);
}).change();
}
};
GRID.prototype.SetPage = function(pageIndex) {
$(this.element).dxDataGrid('instance').pageIndex(pageIndex - 1);
};
GRID.prototype.getSearchParam = function(loadOptions) {
var params = {};
["skip","take","requireTotalCount","requireGroupCount","sort","filter","totalSummary","group","groupSummary"].forEach(function(i) {
if(i in loadOptions && loadOptions[i] !== undefined && loadOptions[i] !== null && loadOptions[i] !== '')
params[i] = JSON.stringify(loadOptions[i]);
});
if( $('[data-grid-search]').length > 0 ) {
var $form = $('[data-grid-search]');
$('input', $form).not('[type="checkbox"]').not('[type="radio"]').each(function() {
var name = $(this).attr('name'),
value = $(this).val();
params[name] = value;
});
$('input[type="checkbox"]', $form).each(function() {
if( $(this).prop('checked') ) {
var name = $(this).attr('name'),
value = $(this).val();
params[name] = value;
}
});
$('input[type="radio"]:checked', $form).each(function() {
var name = $(this).attr('name'),
value = $(this).val();
params[name] = value;
});
$('select', $form).each(function() {
var name = $(this).attr('name'),
value = $(this).find('option:selected').val();
params[name] = value;
})
}
return params;
}
/**
* 그리드를 새로고침한다.
*/
GRID.prototype.refresh = function(pageIndex) {
pageIndex = typeof pageIndex == 'number' && pageIndex > 0 ? pageIndex : null;
if(pageIndex) {
$(this.element).dxDataGrid('instance').pageIndex(pageIndex - 1);
}
$(this.element).dxDataGrid('instance').refresh();
};
/**
* 컬럼을 감추고 숨길수 있다
* @param field
* @param visible
* @constructor
*/
GRID.prototype.SetColumnVisible = function(field, visible) {
};
/**
* 마우스 한번 클릭시 실행되는 이벤트
* @param e
* @constructor
*/
GRID.prototype.OnRowSingleClick = function(e) {};
/**
* 마우스 더블클릭시 실행되는 이벤트
* @param e
* @constructor
*/
GRID.prototype.OnRowDoubleClick = function(e) {};
/**
* 행이 준비되었을때 실행되는 이벤트
* @param e
* @constructor
*/
GRID.prototype.OnRowPrepared = function(e) {};
/**
* 마우스 우클릭시 나타나는 바로가기 메뉴
* @param e
* @constructor
*/
GRID.prototype.OnContextMenuPreparing = function(e) {};
/**
* 선택이 바뀌었을때 실행되는 이벤트
* @param e
* @constructor
*/
GRID.prototype.OnSelectionChanged = function(e) {};
/**
* 셀이 준비되었을때 실행되는 이벤트
* @param e
* @constructor
*/
GRID.prototype.OnCellPrepared = function(e) {};

23
_src/admin/js/modules/toast.js

@ -1,23 +0,0 @@
APP.TOAST = {
confirm : function(msg) {
APP.toast.push({
theme : 'default',
icon : '<i class="far fa-bell"></i>',
msg : msg
});
},
error : function(msg) {
APP.toast.push({
theme : 'danger',
icon : '<i class="far fa-exclamation-circle"></i>',
msg : msg
});
},
success: function(msg) {
APP.toast.push({
theme : 'success',
icon : '<i class="far fa-check-circle"></i>',
msg : msg
})
}
};

18
_src/admin/scss/_variables.scss

@ -20,8 +20,8 @@ $link-color : $body-color; // 링크 텍스트 색상
$link-hover-color : $color-primary; // 링크 오버시 텍스트 색상 $link-hover-color : $color-primary; // 링크 오버시 텍스트 색상
// 폰트 관련 // 폰트 관련
$font-family-base : Gilroy,'Noto Sans KR',sans-serif; // 기본글자에 사용 되는 폰트
$font-family-heading : Gilroy, 'NanumSquare','나눔스퀘어',sans-serif; // 헤딩태그에 사용 되는 폰트
$font-family-base : 'Noto Sans KR',sans-serif; // 기본글자에 사용 되는 폰트
$font-family-heading : 'NanumSquare','나눔스퀘어',sans-serif; // 헤딩태그에 사용 되는 폰트
$font-size-base : 14px; $font-size-base : 14px;
$font-weight-base : 400; $font-weight-base : 400;
$font-weight-bold : 700; $font-weight-bold : 700;
@ -35,27 +35,27 @@ $table-cell-padding: .75rem !default;
$table-cell-padding-sm: .3rem !default; $table-cell-padding-sm: .3rem !default;
// 버튼 INPUT // 버튼 INPUT
$input-btn-padding-y : 7px !default; // 상하
$input-btn-padding-x : 24px !default; // 좌우
$input-btn-font-size : 15px !default;
$input-btn-padding-y : 4px !default; // 상하
$input-btn-padding-x : 9px !default; // 좌우
$input-btn-font-size : 12px !default;
$input-btn-line-height: $line-height-base !default; $input-btn-line-height: $line-height-base !default;
$input-btn-border-radius : 4px !default; $input-btn-border-radius : 4px !default;
$input-btn-padding-y-xs: 4px !default;
$input-btn-padding-x-xs: 12px !default;
$input-btn-padding-y-xs: 1px !default;
$input-btn-padding-x-xs: 5px !default;
$input-btn-font-size-xs: 11px !default; $input-btn-font-size-xs: 11px !default;
$input-btn-line-height-xs: $line-height-base !default; $input-btn-line-height-xs: $line-height-base !default;
$input-btn-border-radius-xs : 2px !default; $input-btn-border-radius-xs : 2px !default;
$input-btn-padding-y-sm: 6.5px !default; $input-btn-padding-y-sm: 6.5px !default;
$input-btn-padding-x-sm: 17px !default; $input-btn-padding-x-sm: 17px !default;
$input-btn-font-size-sm: 13px !default;
$input-btn-font-size-sm: 11px !default;
$input-btn-line-height-sm: $line-height-base !default; $input-btn-line-height-sm: $line-height-base !default;
$input-btn-border-radius-sm : 3px !default; $input-btn-border-radius-sm : 3px !default;
$input-btn-padding-y-lg: 12px !default; $input-btn-padding-y-lg: 12px !default;
$input-btn-padding-x-lg: 25px !default; $input-btn-padding-x-lg: 25px !default;
$input-btn-font-size-lg: 15px !default;
$input-btn-font-size-lg: 13px !default;
$input-btn-line-height-lg: $line-height-base !default; $input-btn-line-height-lg: $line-height-base !default;
$input-btn-border-radius-lg : 6px !default; $input-btn-border-radius-lg : 6px !default;

18
_src/admin/scss/admin.scss

@ -1,11 +1,9 @@
@charset "UTF-8"; @charset "UTF-8";
// BASE // BASE
@import "boot/mixins";
@import "boot/function";
@import "boot/fonts"; @import "boot/fonts";
@import "../../common/scss/global";
@import "variables"; @import "variables";
@import "boot/reset";
// 애니메이션,레이아웃,유틸리티,컴포넌트 // 애니메이션,레이아웃,유틸리티,컴포넌트
@import "common/animation"; @import "common/animation";
@ -18,20 +16,12 @@
@import "components/grid"; @import "components/grid";
@import "components/form"; @import "components/form";
@import "components/pagination"; @import "components/pagination";
@import "components/label";
// 각종 플러그인 SCSS 플러그인 커스텀 // 각종 플러그인 SCSS 플러그인 커스텀
@import "plugins/jquery_ui"; @import "plugins/jquery_ui";
@import "plugins/fontawesome5/fontawesome";
@import "plugins/fontawesome5/regular";
@import "plugins/fontawesome5/light";
@import "plugins/fontawesome5/solid";
@import "plugins/fontawesome5/brands";
@import "plugins/jquery.datetimepicker.css";
@import "plugins/ax5ui/ax5";
@import "plugins/ax5ui/ax5grid";
@import "plugins/ax5ui/ax5mask";
@import "plugins/ax5ui/ax5modal";
@import "plugins/ax5ui/ax5toast";
@import "plugins/devextreme/dx.common";
@import "plugins/devextreme/dx.light.compact";
@import "plugins/plugins_custom"; @import "plugins/plugins_custom";
// 페이지 SCSS 파일 // 페이지 SCSS 파일

51
_src/admin/scss/boot/_fonts.scss

@ -1,54 +1,3 @@
@font-face {
font-family: 'Gilroy';
font-weight:300;
src: url(../fonts/Gilroy-Light.eot);
src: url(../fonts/Gilroy-Light.eot?#iefix) format('embedded-opentype'),
url(../fonts/Gilroy-Light.woff2) format('woff2'),
url(../fonts/Gilroy-Light.woff) format('woff'),
url(../fonts/Gilroy-Light.ttf) format('truetype');
}
@font-face {
font-family: 'Gilroy';
font-weight:400;
src: url(../fonts/Gilroy-Regular.eot);
src: url(../fonts/Gilroy-Regular.eot?#iefix) format('embedded-opentype'),
url(../fonts/Gilroy-Regular.woff2) format('woff2'),
url(../fonts/Gilroy-Regular.woff) format('woff'),
url(../fonts/Gilroy-Regular.ttf) format('truetype');
}
@font-face {
font-family: 'Gilroy';
font-weight:500;
src: url(../fonts/Gilroy-Medium.eot);
src: url(../fonts/Gilroy-Medium.eot?#iefix) format('embedded-opentype'),
url(../fonts/Gilroy-Medium.woff2) format('woff2'),
url(../fonts/Gilroy-Medium.woff) format('woff'),
url(../fonts/Gilroy-Medium.ttf) format('truetype');
}
@font-face {
font-family: 'Gilroy';
font-weight:700;
src: url(../fonts/Gilroy-Bold.eot);
src: url(../fonts/Gilroy-Bold.eot?#iefix) format('embedded-opentype'),
url(../fonts/Gilroy-Bold.woff2) format('woff2'),
url(../fonts/Gilroy-Bold.woff) format('woff'),
url(../fonts/Gilroy-Bold.ttf) format('truetype');
}
@font-face {
font-family: 'Gilroy';
font-weight:800;
src: url(../fonts/Gilroy-ExtraBold.eot);
src: url(../fonts/Gilroy-ExtraBold.eot?#iefix) format('embedded-opentype'),
url(../fonts/Gilroy-ExtraBold.woff2) format('woff2'),
url(../fonts/Gilroy-ExtraBold.woff) format('woff'),
url(../fonts/Gilroy-ExtraBold.ttf) format('truetype');
}
@font-face { @font-face {
font-family: 'NanumSquare'; font-family: 'NanumSquare';
font-weight: 400; font-weight: 400;

30
_src/admin/scss/common/_layout.scss

@ -1,8 +1,15 @@
html {
font-size:12px;
}
body { body {
height:100vh; height:100vh;
min-width:1200px;
&.iframe {
min-width:0;
}
} }
$header-height : 50px; $header-height : 50px;
$nav-height : 59px;
$nav-height : 40px;
#header { #header {
position:relative; position:relative;
@ -117,7 +124,7 @@ $nav-height : 59px;
} }
i, span { i, span {
font-size:15px;
font-size:14px;
} }
i + span { i + span {
@ -139,7 +146,7 @@ $nav-height : 59px;
position:absolute; position:absolute;
top:100%; top:100%;
left:0; left:0;
width:130px;
width:150px;
background:#fff; background:#fff;
list-style:none; list-style:none;
padding:0; padding:0;
@ -151,8 +158,8 @@ $nav-height : 59px;
a { a {
display:block; display:block;
padding:12px 15px;
font-size:13px;
padding:6px 15px;
font-size:12px;
color:#282828; color:#282828;
cursor:pointer; cursor:pointer;
@ -161,6 +168,13 @@ $nav-height : 59px;
} }
} }
&.divider {
height: 1px;
margin: 4px 0;
overflow: hidden;
background-color: #e5e5e5;
}
&.active { &.active {
a { a {
background-color:#f4f8f9; background-color:#f4f8f9;
@ -198,6 +212,12 @@ $nav-height : 59px;
.page-header { .page-header {
margin-bottom:15px; margin-bottom:15px;
border-bottom: 1px solid #ddd;
padding-bottom: 5px;
.iframe & {
margin-top:0;
}
.page-title { .page-title {
font-size:23px; font-size:23px;

71
_src/admin/scss/common/_utility.scss

@ -1,69 +1,14 @@
.ellipsis { text-overflow:ellipsis; white-space:nowrap; word-wrap:normal; overflow:hidden; }
.admin-help-wrap {
width:700px; margin:0 auto;
li > img {width:700px;}
.point-color {color:#e60035}
}
/* 높이/너비/마진/패딩 */
@for $i from 1 to 100 {
.H#{$i * 5} {
height: 5px * $i !important;
}
}
@for $i from 1 to 100{
.W#{$i * 5} {
width: 5px * $i !important;
}
}
@for $i from 1 to 10 {
.M#{$i * 5} {
margin:5px * $i;
}
.MT#{$i * 5} {
margin-top:5px * $i;
}
.MR#{$i*5} {
margin-right:5px * $i;
}
.MB#{$i * 5} {
margin-bottom:5px * $i;
}
.ML#{$i * 5} {
margin-left:5px * $i;
}
.PT#{$i * 5} {
padding-top:5px * $i;
}
.PR#{$i * 5} {
padding-right:5px * $i;
}
.PB#{$i * 5} {
padding-bottom:5px * $i;
}
.PL#{$i * 5} {
padding-left:5px * $i;
}
.P#{$i * 5} {
padding:5px * $i;
@each $color, $value in $theme-colors {
.text-#{$color} {
color:$value;
} }
} }
.text-center {
text-align:center !important;
}
.text-left {
text-align:left !important;
}
.alert {
padding: 5px 7px;
.text-right {
text-align:right !important;
}
@each $color, $value in $theme-colors {
.text-#{$color} {
color:$value;
&.alert-danger {
border: 1px solid #e32815;
color: #e32815;
} }
} }

2
_src/admin/scss/components/_buttons.scss

@ -68,7 +68,7 @@ fieldset:disabled a.btn {
} }
.btn-sm { .btn-sm {
@include button-size($input-btn-padding-y-sm, $input-btn-padding-x-sm, $input-btn-font-size-sm, $input-btn-line-height-sm, $input-btn-border-radius-sm);
@include button-size(3px, 5px, $input-btn-font-size-sm, $input-btn-line-height-sm, $input-btn-border-radius-sm);
} }
.btn-block { .btn-block {

92
_src/admin/scss/components/_form.scss

@ -1,16 +1,16 @@
.form-control { .form-control {
display: block; display: block;
width: 100%;
height: 38px;
padding: $input-btn-padding-y ( $input-btn-padding-x / 2);
font-size: $input-btn-font-size;
font-weight: $font-weight-base;
line-height: $input-btn-line-height;
color: #495057;
font-size:12px;
font-weight:400;
height:24px;
width: 100%; ;
padding: $input-btn-padding-y-sm ( $input-btn-padding-x-sm / 2);
line-height: (16em / 12);
color: #333;
background-color: #fff; background-color: #fff;
background-clip: padding-box; background-clip: padding-box;
border: 1px solid #dcdcdc;
border-radius: $input-btn-border-radius;
border: 1px solid #dddddd;
border-radius: 4px;
box-shadow:none; box-shadow:none;
@include transition(); @include transition();
@ -20,7 +20,7 @@
} }
&:focus { &:focus {
border-color: #80bdff;
border-color: rgb(51, 122, 183);
outline: 0; outline: 0;
} }
@ -60,6 +60,35 @@
} }
} }
.tab-list {
@include display-flex;
align-items: center;
padding:0;
margin:0;
list-style:none;
li {
display:block;
& + li {
margin-left:-1px;
}
a {
display:block;
padding:5px 7px;
border:1px solid #ddd;
border-bottom:0 none;
}
&.active {
a {
color:#fff;
background-color:$color-primary;
border-color:$color-primary;
}
}
}
}
select.form-control { select.form-control {
background-image:url(../images/admin/frm-select-arrow.png); background-image:url(../images/admin/frm-select-arrow.png);
background-position: 95% center; background-position: 95% center;
@ -67,6 +96,8 @@ select.form-control {
-webkit-appearance: none; -webkit-appearance: none;
-moz-appearance: none; -moz-appearance: none;
appearance: none; appearance: none;
padding-top:2.5px;
padding-bottom:2.5px;
&::-ms-expand { &::-ms-expand {
display:none; display:none;
@ -78,6 +109,10 @@ select.form-control {
} }
} }
input[type="file"].form-control {
height:36px;
}
.bottom-actions { .bottom-actions {
@include display-flex(); @include display-flex();
align-items: center; align-items: center;
@ -103,12 +138,19 @@ select.form-control {
} }
} }
textarea.form-control[data-autosize] {
height:auto;
resize:none !important;
}
// 체크박스 // 체크박스
.w-radio,
.w-check { .w-check {
position:relative; position:relative;
display:inline-block; display:inline-block;
align-items: center; align-items: center;
vertical-align: middle; vertical-align: middle;
margin:0 30px 0 0;
& + .w-check { & + .w-check {
margin-left:15px; margin-left:15px;
@ -122,7 +164,7 @@ select.form-control {
-moz-user-select: none; -moz-user-select: none;
-ms-user-select: none; -ms-user-select: none;
align-items: center; align-items: center;
height:34px;
height:24px;
&:before { &:before {
content:""; content:"";
@ -137,6 +179,7 @@ select.form-control {
} }
} }
input[type=radio],
input[type=checkbox] { input[type=checkbox] {
position: absolute; position: absolute;
width:1px; width:1px;
@ -209,6 +252,19 @@ select.form-control {
border-left: 1px solid #D8D8D8; border-left: 1px solid #D8D8D8;
position: relative; position: relative;
.caption {
width:100%;
display:block;
background-color:#fbfbfb;
border-bottom: 1px solid #D8D8D8;
min-height: 30px;
line-height:30px;
font-size:14px;
font-family: 나눔스퀘어, NanumSquare, sans-serif;
padding-left:7px;
text-align:center;
}
[data-ax-tr] { [data-ax-tr] {
border-bottom: 1px solid #D8D8D8; border-bottom: 1px solid #D8D8D8;
@include display-flex(); @include display-flex();
@ -286,7 +342,6 @@ select.form-control {
} }
.form-control { .form-control {
font-size:1em;
&.inline-block { &.inline-block {
display: inline-block; display: inline-block;
@ -301,6 +356,8 @@ select.form-control {
.form-control-static { .form-control-static {
padding: 7px; padding: 7px;
min-height:0px; min-height:0px;
line-height:1.5em;
margin-bottom:0;
} }
.radio-inline, .radio-inline,
@ -339,3 +396,14 @@ select.form-control {
} }
} }
} }
.help-block {
display: block;
margin-top: 5px;
margin-bottom: 0px;
color: #737373;
font-size:12px;
}
ul.help-block {
padding:0 0 0 18px;
line-height:1.4em;
}

18
_src/admin/scss/components/_grid.scss

@ -19,7 +19,7 @@
} }
} }
[data-ax5grid] {
.grid {
margin:0; margin:0;
padding:0; padding:0;
position:relative; position:relative;
@ -52,11 +52,12 @@
box-sizing: border-box; box-sizing: border-box;
overflow: hidden; overflow: hidden;
position: relative; position: relative;
padding: 10px;
height:38px;
padding: 5px;
text-align:center; text-align:center;
border:1px solid #ddd; border:1px solid #ddd;
font-weight:400; font-weight:400;
font-size:12px;
line-height:(16em / 12);
} }
} }
} }
@ -68,11 +69,12 @@
background:transparent; background:transparent;
td { td {
line-height:21px;
padding:5px 10px; padding:5px 10px;
background-color:#fff; background-color:#fff;
border:1px solid #ddd; border:1px solid #ddd;
font-weight:300; font-weight:300;
font-size:12px;
line-height:(16em / 12);
&.empty { &.empty {
height:300px; height:300px;
@ -123,3 +125,11 @@
} }
} }
} }
.grid-wrapper {
position:relative;
.grid-container {
height:100%;
}
}

4
_src/admin/scss/components/_label.scss

@ -0,0 +1,4 @@
.label {
margin-bottom:0;
font-size:12px;
}

37
_src/admin/scss/plugins/_plugins_custom.scss

@ -105,3 +105,40 @@
} }
} }
} }
.dx-datagrid {
.dx-datagrid-headers {
border:1px solid #d8d8d8;
.dx-datagrid-table {
.dx-header-row {
background-color:#f9f9f9;
color:#282828;
> td {
vertical-align: middle;
text-align: center !important;
}
}
}
}
}
.dx-datagrid-rowsview {border:1px solid #d8d8d8;}
.ui-datepicker-next {
&:before {
content:'\f054';
font-family: 'Font Awesome 5 Pro';
}
}
.ui-datepicker-prev {
&:before {
content:'\f053';
font-family: 'Font Awesome 5 Pro';
}
}

769
_src/admin/scss/plugins/ax5ui/_ax5grid.scss

@ -1,769 +0,0 @@
//==
$ax5grid-border: 1px solid #ccc !default;
$ax5grid-bg: #fff !default;
$ax5grid-font-size: 12px !default;
$ax5grid-column-border: 1px solid #ccc !default;
//== header
$ax5grid-header-column-color: #222 !default;
$ax5grid-header-column-border: 1px solid #ccc !default;
$ax5grid-header-column-box-shadow: inset 1px 1px 0px 0px #fff !default;
$ax5grid-header-column-bg-colors: (#FFFFFF, #F0F0F0) !default;
$ax5grid-header-column-hover-bg-colors: (#eee, #eee) !default;
$ax5grid-header-column-resizer-color: #ff3300 !default;
$ax5grid-header-column-resizer-size: 4px !default;
$ax5grid-header-sorter-size: 9px !default;
$ax5grid-header-sorter-color: #000 !default;
//== aside
$ax5grid-aside-border: 1px solid darken(#ccc, 0%) !default;
$ax5grid-aside-bg: #f2f2f2 !default;
$ax5grid-aside-column-shadow: inset 1px 1px 0px 0px #fff !default;
$ax5grid-frozen-line-border: 1px solid darken(#ccc, 10%) !default;
//== footsum
$ax5grid-footsum-bg: #ffe7e2 !default;
$ax5grid-footsum-line-border: 1px solid darken(#ccc, 10%) !default;
//== page
$ax5grid-page-border: 1px solid #ccc !default;
$ax5grid-page-bg-colors: (#FFFFFF, #F0F0F0) !default;
$ax5grid-page-navigation-padding: 5px !default;
$ax5grid-page-navigation-font-size: 12px !default;
$ax5grid-page-navigation-btn-min-width: 20px !default;
$ax5grid-page-navigation-btn-border: 0px none !default;
$ax5grid-page-navigation-btn-border-radius: 5px !default;
$ax5grid-page-navigation-btn-bg: transparent !default;
$ax5grid-page-navigation-btn-font-size: 11px !default;
$ax5grid-page-navigation-btn-color: #222 !default;
$ax5grid-page-navigation-btn-hover-bg: #888 !default;
$ax5grid-page-navigation-btn-hover-color: #fff !default;
$ax5grid-page-status-font-size: 12px !default;
$ax5grid-page-status-padding: 10px !default;
$ax5grid-page-status-color: #222 !default;
//== scroll
$ax5grid-scroll-track-border: 1px solid #ccc !default;
$ax5grid-scroll-track-bg: #f3f3f3 !default;
$ax5grid-scroll-corner-bg: #EAEDEF !default;
$ax5grid-scroll-bar-border-radius: 10px !default;
$ax5grid-scroll-bar-border: 0px solid #fff !default;
$ax5grid-scroll-bar-bg: #ccc !default;
$ax5grid-scroll-bar-hover-border: 0px solid #ccc !default;
$ax5grid-scroll-bar-hover-bg: #bababa !default;
//== body.row
$ax5grid-row-bg-0: #f3f3f3 !default;
$ax5grid-row-bg-1: #fff !default;
$ax5grid-row-bg-2: #f3f3f3 !default;
$ax5grid-row-bg-3: #fff !default;
$ax5grid-row-hover-bg: lighten(#cce2f3, 5%) !default;
$ax5grid-row-grouping-bg: #ffffe7 !default;
$ax5grid-row-selected: lighten(#b1d7fe, 10%) !default;
//== body.cell
$ax5grid-cell-padding-row-selector: 5px !default;
$ax5grid-cell-padding: 3px 5px !default;
$ax5grid-cell-checkbox-border: 1px solid #ccc !default;
$ax5grid-cell-checkbox-border-radius: 3px !default;
$ax5grid-cell-checkbox-bg-colors: (#FFFFFF, #F0F0F0) !default;
$ax5grid-cell-disable-checkbox-bg-colors: (darken(nth($ax5grid-cell-checkbox-bg-colors, 2), 10%), darken(nth($ax5grid-cell-checkbox-bg-colors, 1), 10%)) !default;
$ax5grid-cell-checkbox-arrow-color: $brand-primary !default;
$ax5grid-cell-focused-box-shadow: inset 0px 0px 1px 1px #0581f2 !default;
$ax5grid-cell-focused-bg: lighten(#b1d7fe, 10%) !default;
$ax5grid-cell-focused-color: #000 !default;
$ax5grid-cell-selected-border-color: #ccc !default;
$ax5grid-cell-selected-bg: #b1d7fe !default;
$ax5grid-cell-selected-color: #000 !default;
//== resizer
$ax5grid-resizer-color: #ff3300 !default;
$ax5grid-resizer-size: 2px !default;
// mixins
@mixin gridBoxModal() {
margin: 0;
padding: 0;
}
@mixin gridColumn($container) {
box-sizing: border-box;
overflow: hidden;
position: relative;
padding: 0;
font-size: $ax5grid-font-size;
border: 0 none;
&.hasBorder {
border-right: $ax5grid-column-border;
border-bottom: $ax5grid-column-border;
}
&.isLastColumn {
}
&.lineNumberColumn {
}
&.focused {
box-shadow: $ax5grid-cell-focused-box-shadow;
}
@if ($container == "header") {
cursor: pointer;
box-shadow: $ax5grid-header-column-box-shadow;
&:hover {
@include ax-background(top, $ax5grid-header-column-hover-bg-colors);
}
&[data-ax5grid-column-row="null"] {
box-shadow: none;
}
}
&[data-ax5grid-column-row="null"] {
border-right: 0 none;
}
&[data-ax5grid-column-selected] {
background: $ax5grid-cell-selected-bg;
border-color: $ax5grid-cell-selected-border-color;
color: $ax5grid-cell-selected-color;
}
&[data-ax5grid-column-focused] {
box-shadow: $ax5grid-cell-focused-box-shadow;
background: $ax5grid-cell-focused-bg;
color: $ax5grid-cell-focused-color;
}
&[data-ax5grid-column-attr="rowSelector"] {
cursor: pointer;
[data-ax5grid-cellHolder] {
padding: $ax5grid-cell-padding-row-selector;
}
.checkBox {
display: inline-block;
position: relative;
border: $ax5grid-cell-checkbox-border;
border-radius: $ax5grid-cell-checkbox-border-radius;
@include ax-background(top, $ax5grid-cell-checkbox-bg-colors);
height: 100%;
width: 100%;
&:after {
content: '';
width: 60%;
height: 40%;
position: absolute;
top: 20%;
right: 20%;
border: 0.2em solid $ax5grid-cell-checkbox-arrow-color;
border-top: none;
border-right: none;
background: transparent;
opacity: 0.0;
@include transform(rotate(-50deg));
}
}
&[data-ax5grid-selected="true"] {
.checkBox {
&:after {
opacity: 1;
}
}
}
}
&[data-ax5grid-column-attr="lineNumber"] {
}
[data-ax5grid-cellHolder] {
// 그리드 셀표현 : 그리드의 컬럼텍스트가 여기에 출력됨
display: block;
box-sizing: border-box;
padding: $ax5grid-cell-padding;
font-size: $ax5grid-font-size;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
@if ($container == "header") {
//text-align: center;
}
&[data-ax5grid-text-align="left"] {
text-align: left;
}
&[data-ax5grid-text-align="center"] {
text-align: center;
}
&[data-ax5grid-text-align="right"] {
text-align: right;
}
&[data-ax5grid-cellHolder="multiLine"] {
white-space: normal;
}
[data-ax5grid-editor] {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
border: 0 none;
background: $ax5grid-bg;
&::-ms-clear {
display: none;
}
}
[data-ax5select] {
position: absolute;
display: block;
left: 0;
top: 0;
width: 100%;
height: 100%;
border: 0px none;
background: $ax5grid-bg;
.ax5select-display {
height: 100%;
border-radius: 0;
}
}
[data-ax5grid-editor="checkbox"] {
display: inline-block;
position: relative;
border: $ax5grid-cell-checkbox-border;
border-radius: $ax5grid-cell-checkbox-border-radius;
@include ax-background(top, $ax5grid-cell-checkbox-bg-colors);
height: 100%;
&:after {
content: '';
width: 60%;
height: 40%;
position: absolute;
top: 20%;
right: 20%;
border: 0.2em solid $ax5grid-cell-checkbox-arrow-color;
border-top: none;
border-right: none;
background: transparent;
opacity: 0.0;
@include transform(rotate(-50deg));
}
&[data-ax5grid-checked="true"] {
&:after {
opacity: 1.0;
}
}
}
[data-ax5grid-tnode-arrow] {
display: inline-block;
box-sizing: content-box;
text-align: right;
text-shadow: 0 -1px #fff;
padding: 0 5px 0 0;
}
a[data-ax5grid-tnode-arrow] {
cursor: pointer;
text-decoration: none;
&:hover {
text-decoration: none;
}
}
[data-ax5grid-tnode-item="group"] {
display: inline-block;
}
[data-ax5grid-tnode-item="item"] {
display: inline-block;
}
}
}
@mixin gridRowBackground() {
&.tr-0 {
background: $ax5grid-row-bg-0;
}
&.tr-1 {
background: $ax5grid-row-bg-1;
}
&.tr-2 {
background: $ax5grid-row-bg-2;
}
&.tr-3 {
background: $ax5grid-row-bg-3;
}
&.hover {
background: $ax5grid-row-hover-bg;
}
&[data-ax5grid-grouping-tr="true"] {
background: $ax5grid-row-grouping-bg;
}
&[data-ax5grid-selected="true"] {
background: $ax5grid-row-selected;
td {
//color: #fff;
//box-shadow: inset 1px 1px 0px 0px #fff;
&[data-ax5grid-column-attr="rowSelector"],
&[data-ax5grid-column-attr="lineNumber"] {
box-shadow: none;
}
&[data-ax5grid-column-attr="rowSelector"] {
.checkBox {
&:after {
opacity: 1;
}
}
}
}
}
&[data-ax5grid-disable-selection="true"] {
// background: $ax5grid-row-selected;
td {
&[data-ax5grid-column-attr="rowSelector"] {
.checkBox {
cursor: not-allowed;
@include ax-background(top, $ax5grid-cell-disable-checkbox-bg-colors);
&:after {
opacity: 0;
}
}
}
}
}
// mergeCells 대상 컬럼 배경생 통일.
td.merged {
background: $ax5grid-row-bg-1;
}
}
@mixin gridPanel($container) {
[data-ax5grid-panel] {
@include gridBoxModal();
position: absolute;
overflow: hidden;
/*
overflow: hidden;
-webkit-overflow-scrolling: touch;
transform: translate3d(0, 0, 0);
*/
table {
table-layout: fixed;
border-collapse: separate;
border-spacing: 0;
border: 0 none;
width: 100%;
@if ($container == "header") {
height: 100%;
}
tr {
border-bottom: 0 none;
@include gridRowBackground();
td {
@include gridColumn($container);
}
}
}
&[data-ax5grid-panel="aside-header"] {
border-right: $ax5grid-aside-border;
table {
tr {
td {
text-align: center;
}
}
}
}
&[data-ax5grid-panel="top-aside-body"],
&[data-ax5grid-panel="aside-body"],
&[data-ax5grid-panel="bottom-aside-body"] {
border-right: $ax5grid-aside-border;
background: $ax5grid-aside-bg;
table {
tr {
background: $ax5grid-aside-bg;
td {
text-align: center;
box-shadow: $ax5grid-aside-column-shadow;
}
}
}
}
&[data-ax5grid-panel="left-header"],
&[data-ax5grid-panel="top-left-body"],
&[data-ax5grid-panel="left-body"],
&[data-ax5grid-panel="bottom-left-body"] {
border-right: $ax5grid-frozen-line-border; /// frozen Line color
}
&[data-ax5grid-panel="top-aside-body"],
&[data-ax5grid-panel="top-left-body"],
&[data-ax5grid-panel="top-body"],
&[data-ax5grid-panel="top-right-body"] {
border-bottom: $ax5grid-frozen-line-border; /// frozen Line color
}
&[data-ax5grid-panel="bottom-aside-body"],
&[data-ax5grid-panel="bottom-left-body"],
&[data-ax5grid-panel="bottom-body"],
&[data-ax5grid-panel="bottom-right-body"] {
border-top: $ax5grid-footsum-line-border; /// footSum Line color
}
&[data-ax5grid-panel="bottom-aside-body"],
&[data-ax5grid-panel="bottom-left-body"],
&[data-ax5grid-panel="bottom-body"],
&[data-ax5grid-panel="bottom-right-body"] {
background: $ax5grid-footsum-bg;
}
[data-ax5grid-panel-scroll] {
position: absolute;
left: 0;
top: 0;
}
}
}
@mixin scrollBar($type) {
position: absolute;
top: 0;
left: 0;
@include border-top-radius($ax5grid-scroll-bar-border-radius);
@include border-bottom-radius($ax5grid-scroll-bar-border-radius);
box-sizing: border-box;
border: $ax5grid-scroll-bar-border;
background: $ax5grid-scroll-bar-bg;
@if ($type == "vertical-bar") {
cursor: ns-resize;
} @else {
cursor: ew-resize;
}
&:hover {
border: $ax5grid-scroll-bar-hover-border;
background: $ax5grid-scroll-bar-hover-bg;
}
}
@mixin resizer($type: "horizontal") {
display: none;
&.live {
display: block;
position: absolute;
top: 0;
left: 0;
background: $ax5grid-resizer-color;
opacity: 0.5;
@if ($type == "vertical") {
height: $ax5grid-resizer-size;
width: 100%;
cursor: row-resize;
} @else {
height: 100%;
width: $ax5grid-resizer-size;
cursor: col-resize;
}
}
}
// body
[data-ax5grid] {
box-sizing: border-box;
*,
*:before,
*:after {
box-sizing: border-box;
}
[data-ax5grid-container="root"] {
@include gridBoxModal();
position: relative;
background: $ax5grid-bg;
border: $ax5grid-border;
overflow: hidden;
[data-ax5grid-container="hidden"] {
@include gridBoxModal();
position: absolute;
//z-index: 100;
left: -100%;
top: -100%;
height: 100%;
width: 100%;
}
[data-ax5grid-container="header"] {
user-select: none;
@include gridBoxModal();
position: relative;
overflow: hidden;
@include ax-background(top, $ax5grid-header-column-bg-colors);
border: 0px none;
border-bottom: $ax5grid-header-column-border;
@include gridPanel("header");
color: $ax5grid-header-column-color;
[data-ax5grid-column-resizer] {
position: absolute;
right: 0;
top: 0;
width: $ax5grid-header-column-resizer-size;
height: 100%;
cursor: col-resize;
&:hover {
background: $ax5grid-header-column-resizer-color;
opacity: 0.5;
}
}
[data-ax5grid-column-sort] {
position: relative;
//right: 0;
//top: 2px;
width: 10px;
height: 10px;
display: inline-block;
@mixin sort-arrow($arrow-size, $ratio-0, $ratio-1, $arrow-color, $opacity, $direction) {
position: absolute;
content: ' ';
width: 0;
height: 0;
display: inline-block;
border-left: $arrow-size/$ratio-0 solid transparent;
border-right: $arrow-size/$ratio-0 solid transparent;
@if ($direction == "up") {
border-bottom: ($arrow-size)/$ratio-1 solid $arrow-color;
} @else {
border-top: ($arrow-size)/$ratio-1 solid $arrow-color;
}
background: transparent;
opacity: $opacity;
}
&:before {
top: 0;
left: 0;
@include sort-arrow($ax5grid-header-sorter-size, 2.5, 2.2, $ax5grid-header-sorter-color, 0.3, "up");
}
&:after {
bottom: 0;
left: 0;
@include sort-arrow($ax5grid-header-sorter-size, 2.5, 2.2, $ax5grid-header-sorter-color, 0.3, "down");
}
&[data-ax5grid-column-sort-order="asc"] {
&:before {
top: 2px;
left: 0;
@include sort-arrow($ax5grid-header-sorter-size + 1, 2.5, 2.0, $ax5grid-header-sorter-color, 0.8, "up");
}
&:after {
display: none;
}
}
&[data-ax5grid-column-sort-order="desc"] {
&:before {
display: none;
}
&:after {
bottom: 2px;
left: 0;
@include sort-arrow($ax5grid-header-sorter-size + 1, 2.5, 2.0, $ax5grid-header-sorter-color, 0.8, "down");
}
}
}
[data-ax5grid-column-filter] {
// 개발중..
$filter-size: 10px;
position: absolute;
left: 0;
top: 0;
width: 10px;
height: 10px;
cursor: pointer;
&:before {
content: ' ';
width: 0;
height: 0;
display: inline-block;
border-left: $filter-size/2 solid transparent;
border-right: $filter-size/2 solid transparent;
border-top: ($filter-size) solid #000;
background: transparent;
opacity: 1;
}
}
}
[data-ax5grid-container="body"] {
@include gridBoxModal();
position: relative;
overflow: hidden;
@include gridPanel("body");
/*
@keyframes fadein {
from { opacity: 0; }
to { opacity: 1; }
}
[data-ax5grid-panel-scroll="body"]{
table {
@include animation(fadein 0.3s);
}
}
*/
}
[data-ax5grid-container="page"] {
@include gridBoxModal();
position: absolute;
bottom: 0;
left: 0;
width: 100%;
overflow: hidden;
@include ax-background(top, $ax5grid-page-bg-colors);
border: 0px none;
border-top: $ax5grid-page-border;
[data-ax5grid-page="holder"] {
@include gridBoxModal();
display: table;
//table-layout: fixed;
width: 100%;
height: 100%;
[data-ax5grid-page="navigation"] {
@include gridBoxModal();
display: table-cell;
vertical-align: middle;
text-align: left;
padding-left: $ax5grid-page-navigation-padding;
font-size: $ax5grid-page-navigation-font-size;
[data-ax5grid-page-navigation="holder"] {
display: table;
[data-ax5grid-page-navigation="cell"], [data-ax5grid-page-navigation="cell-paging"] {
display: table-cell;
vertical-align: middle;
}
[data-ax5grid-page-navigation="cell-paging"] {
padding: 0 $ax5grid-page-navigation-padding;
}
[data-ax5grid-page-move] {
box-sizing: border-box;
min-width: $ax5grid-page-navigation-btn-min-width;
border-radius: $ax5grid-page-navigation-btn-border-radius;
padding: 1px;
border: $ax5grid-page-navigation-btn-border;
background: $ax5grid-page-navigation-btn-bg;
font-size: $ax5grid-page-navigation-btn-font-size;
color: $ax5grid-page-navigation-btn-color;
outline: 0;
&[data-ax5grid-page-selected="true"], &:active {
background-color: $ax5grid-page-navigation-btn-hover-bg;
color: $ax5grid-page-navigation-btn-hover-color;
}
&:hover {
text-decoration: underline;
}
}
}
}
[data-ax5grid-page="status"] {
@include gridBoxModal();
display: table-cell;
text-align: right;
vertical-align: middle;
padding-right: $ax5grid-page-status-padding;
font-size: $ax5grid-page-status-font-size;
color: $ax5grid-page-status-color;
}
}
}
[data-ax5grid-container="scroller"] {
@include gridBoxModal();
position: absolute;
right: 0px;
bottom: 0px;
$scroller-size: 15px;
[data-ax5grid-scroller="vertical"] {
box-sizing: border-box;
position: absolute;
display: none;
right: 0;
bottom: 0;
width: $scroller-size;
height: 100%;
background: $ax5grid-scroll-track-bg;
border-left: $ax5grid-scroll-track-border;
[data-ax5grid-scroller="vertical-bar"] {
@include scrollBar("vertical-bar");
}
}
[data-ax5grid-scroller="horizontal"] {
box-sizing: border-box;
position: absolute;
display: none;
right: 0;
bottom: 0;
height: $scroller-size;
width: 100%;
background: $ax5grid-scroll-track-bg;
border-top: $ax5grid-scroll-track-border;
[data-ax5grid-scroller="horizontal-bar"] {
@include scrollBar("horizontal-bar");
}
}
[data-ax5grid-scroller="corner"] {
position: absolute;
display: none;
right: 0px;
bottom: 0px;
width: $scroller-size;
height: $scroller-size;
background: $ax5grid-scroll-corner-bg;
border-top: $ax5grid-scroll-track-border;
border-left: $ax5grid-scroll-track-border;
}
}
[data-ax5grid-resizer="horizontal"] {
@include resizer("horizontal");
}
[data-ax5grid-resizer="vertical"] {
@include resizer("vertical");
}
}
}

256
_src/admin/scss/plugins/ax5ui/_ax5toast.scss

@ -1,256 +0,0 @@
//============== toast
$ax5toast-z-index: 2000;
// 0:left,top / 1:right,top / 2:right,bottom / 3:left,bottom
$ax5toast-container-width: auto !default;
$ax5toast-container-padding: 10px !default;
$ax5toast-box-model: border-box !default;
$ax5toast-border: 1px solid rgb(255/2, 255/2, 255/2) !default;
$ax5toast-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.175) !default;
$ax5toast-body-padding: 6px !default;
$ax5toast-border-radius: 8px !default;
$ax5toast-opacity: 0.9 !default;
$ax5toast-box-margin: 5px 0px 5px 0px !default;
$ax5toast-icon-size: 24px;
$ax5toast-easing: $ease-in-out-quint;
$ax5toast-easing-time: 0.3s;
//** Border color for elements within toast
$ax5toast-default-text: #282828 !default;
$ax5toast-default-bg: #fff !default;
$ax5toast-default-color: $body-color !default;
$ax5toast-primary-text: $brand-primary !default;
$ax5toast-primary-bg: #fff !default;
$ax5toast-primary-color: $brand-primary !default;
$ax5toast-success-text: $brand-success !default;
$ax5toast-success-bg: #fff !default;
$ax5toast-success-color: $brand-success !default;
$ax5toast-info-text: $brand-info !default;
$ax5toast-info-bg: #fff !default;
$ax5toast-info-color: $brand-info !default;
$ax5toast-warning-text: #fff !default;
$ax5toast-warning-bg: $brand-warning !default;
$ax5toast-warning-color: $brand-warning !default;
$ax5toast-danger-text: #fff !default;
$ax5toast-danger-bg: $brand-warning !default;
$ax5toast-danger-color: $brand-danger !default;
@mixin ax-toast() {
box-sizing: $ax5toast-box-model;
border: $ax5toast-border;
opacity: $ax5toast-opacity;
@include ax-border-radius($ax5toast-border-radius);
box-shadow: $ax5toast-box-shadow;
position: relative;
margin: $ax5toast-box-margin;
}
@mixin ax-toast-section() {
display: table;
padding: $ax5toast-body-padding;
.ax-toast-icon {
display: table-cell;
padding: $ax5toast-body-padding;
text-align: left;
font-size: $ax5toast-icon-size;
width: $ax5toast-icon-size;
vertical-align: middle;
}
.ax-toast-body {
display: table-cell;
padding: $ax5toast-body-padding;
text-align: left;
vertical-align: middle;
}
.ax-toast-buttons {
display: table-cell;
padding: $ax5toast-body-padding;
text-align: right;
vertical-align: middle;
button {
&:not(:last-child) {
margin-right: 3px;
}
}
}
.ax-toast-close {
display: table-cell;
padding: $ax5toast-body-padding;
text-align: right;
vertical-align: top;
text-decoration: none;
cursor: pointer;
}
}
@mixin toast-variant($text-color, $bg-color, $color) {
background: $bg-color;
color: $text-color;
.ax-toast-icon {
color: $color;
}
.ax-toast-close {
color: $text-color;
}
}
@include keyframes(ax-toast-bottom) {
from {
@include transform(translateY(-100px) scale(0.7));
}
to {
//@include opacity($mask-bg-opacity);
@include transform(translateY(0px) scale(1))
}
}
@include keyframes(ax-toast-top) {
from {
@include transform(translateY(100px) scale(0.7));
}
to {
//@include opacity($mask-bg-opacity);
@include transform(translateY(0px) scale(1))
}
}
@include keyframes(ax-toast-removed-bottom) {
from {
@include transform(translateY(0px));
opacity: 1.0;
}
to {
@include transform(translateY(10px) scale(0.7));
opacity: 0.0;
}
}
@include keyframes(ax-toast-removed-top) {
from {
@include transform(translateY(0px));
opacity: 1.0;
}
to {
@include transform(translateY(-10px) scale(0.7));
opacity: 0.0;
}
}
@include keyframes(ax-toast-destroy) {
from {
@include transform(scale(1));
opacity: 1.0;
}
to {
@include transform(scale(1.5));
opacity: 0.0;
}
}
// mixins --------------------------------------------- end
.ax5-ui-toast-container {
z-index: $ax5toast-z-index;
position: fixed;
width: $ax5toast-container-width;
padding: $ax5toast-container-padding;
box-sizing: border-box;
*,
*:before,
*:after {
box-sizing: border-box;
}
.ax5-ui-toast {
@include ax-toast();
@include ax-toast-section();
@include transition(all $ax5toast-easing-time ease-in-out);
@include toast-variant($ax5toast-default-text, $ax5toast-default-bg, $ax5toast-default-color);
&.primary {
@include toast-variant($ax5toast-primary-text, $ax5toast-primary-bg, $ax5toast-primary-color);
}
&.success {
@include toast-variant($ax5toast-success-text, $ax5toast-success-bg, $ax5toast-success-color);
}
&.info {
@include toast-variant($ax5toast-info-text, $ax5toast-info-bg, $ax5toast-info-color);
}
&.warning {
@include toast-variant($ax5toast-warning-text, $ax5toast-warning-bg, $ax5toast-warning-color);
}
&.danger {
@include toast-variant($ax5toast-danger-text, $ax5toast-danger-bg, $ax5toast-danger-color);
}
}
&.bottom-left {
left: 0;
bottom: 0;
.ax5-ui-toast {
@include animation(ax-toast-top $ax5toast-easing-time $ax5toast-easing);
&.removed {
@include animation(ax-toast-removed-bottom $ax5toast-easing-time ease forwards);
}
&.destroy {
@include animation(ax-toast-destroy $ax5toast-easing-time ease forwards);
}
}
}
&.bottom-right {
right: 0;
bottom: 0;
.ax5-ui-toast {
@include animation(ax-toast-top $ax5toast-easing-time $ax5toast-easing);
&.removed {
@include animation(ax-toast-removed-bottom $ax5toast-easing-time ease forwards);
}
&.destroy {
@include animation(ax-toast-destroy $ax5toast-easing-time ease forwards);
}
}
}
&.top-left {
left: 0;
top: 0;
.ax5-ui-toast {
@include animation(ax-toast-bottom $ax5toast-easing-time $ax5toast-easing);
&.removed {
@include animation(ax-toast-removed-top $ax5toast-easing-time ease forwards);
}
&.destroy {
@include animation(ax-toast-destroy $ax5toast-easing-time ease forwards);
}
}
}
&.top-right {
right: 0;
top: 0;
.ax5-ui-toast {
@include animation(ax-toast-bottom $ax5toast-easing-time $ax5toast-easing);
&.removed {
@include animation(ax-toast-removed-top $ax5toast-easing-time ease forwards);
}
&.destroy {
@include animation(ax-toast-destroy $ax5toast-easing-time ease forwards);
}
}
}
}

7403
_src/admin/scss/plugins/devextreme/dx.common.scss
File diff suppressed because it is too large
View File

13343
_src/admin/scss/plugins/devextreme/dx.light.compact.scss
File diff suppressed because it is too large
View File

23
_src/admin/scss/plugins/fontawesome5/_rotated-flipped.scss

@ -1,23 +0,0 @@
// Rotated & Flipped Icons
// -------------------------
.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
.#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(-1, -1, 2); }
// Hook for IE8-9
// -------------------------
:root {
.#{$fa-css-prefix}-rotate-90,
.#{$fa-css-prefix}-rotate-180,
.#{$fa-css-prefix}-rotate-270,
.#{$fa-css-prefix}-flip-horizontal,
.#{$fa-css-prefix}-flip-vertical {
filter: none;
}
}

21
_src/admin/scss/plugins/fontawesome5/brands.scss

@ -1,21 +0,0 @@
/*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@font-face {
font-family: 'Font Awesome 5 Brands';
font-style: normal;
font-weight: normal;
src: url('#{$fa-font-path}/fa-brands-400.eot');
src: url('#{$fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'),
url('#{$fa-font-path}/fa-brands-400.woff') format('woff'),
url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'),
url('#{$fa-font-path}/fa-brands-400.svg#fontawesome') format('svg');
}
.fab {
font-family: 'Font Awesome 5 Brands';
}

16
_src/admin/scss/plugins/fontawesome5/fontawesome.scss

@ -1,16 +0,0 @@
/*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@import 'mixins';
@import 'core';
@import 'larger';
@import 'fixed-width';
@import 'list';
@import 'bordered-pulled';
@import 'animated';
@import 'rotated-flipped';
@import 'stacked';
@import 'icons';
@import 'screen-reader';

22
_src/admin/scss/plugins/fontawesome5/light.scss

@ -1,22 +0,0 @@
/*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@font-face {
font-family: 'Font Awesome 5 Pro';
font-style: normal;
font-weight: 300;
src: url('#{$fa-font-path}/fa-light-300.eot');
src: url('#{$fa-font-path}/fa-light-300.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-light-300.woff2') format('woff2'),
url('#{$fa-font-path}/fa-light-300.woff') format('woff'),
url('#{$fa-font-path}/fa-light-300.ttf') format('truetype'),
url('#{$fa-font-path}/fa-light-300.svg#fontawesome') format('svg');
}
.fal {
font-family: 'Font Awesome 5 Pro';
font-weight: 300;
}

23
_src/admin/scss/plugins/fontawesome5/solid.scss

@ -1,23 +0,0 @@
/*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@font-face {
font-family: 'Font Awesome 5 Pro';
font-style: normal;
font-weight: 900;
src: url('#{$fa-font-path}/fa-solid-900.eot');
src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
url('#{$fa-font-path}/fa-solid-900.woff') format('woff'),
url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'),
url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
}
.fa,
.fas {
font-family: 'Font Awesome 5 Pro';
font-weight: 900;
}

569
_src/admin/scss/plugins/jquery.datetimepicker.css

@ -1,569 +0,0 @@
.xdsoft_datetimepicker {
box-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.506);
background: #fff;
border-bottom: 1px solid #bbb;
border-left: 1px solid #ccc;
border-right: 1px solid #ccc;
border-top: 1px solid #ccc;
color: #333;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
padding: 8px;
padding-left: 0;
padding-top: 2px;
position: absolute;
z-index: 9999;
-moz-box-sizing: border-box;
box-sizing: border-box;
display: none;
}
.xdsoft_datetimepicker.xdsoft_rtl {
padding: 8px 0 8px 8px;
}
.xdsoft_datetimepicker iframe {
position: absolute;
left: 0;
top: 0;
width: 75px;
height: 210px;
background: transparent;
border: none;
}
/*For IE8 or lower*/
.xdsoft_datetimepicker button {
border: none !important;
}
.xdsoft_noselect {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
.xdsoft_noselect::selection { background: transparent }
.xdsoft_noselect::-moz-selection { background: transparent }
.xdsoft_datetimepicker.xdsoft_inline {
display: inline-block;
position: static;
box-shadow: none;
}
.xdsoft_datetimepicker * {
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 0;
margin: 0;
}
.xdsoft_datetimepicker .xdsoft_datepicker, .xdsoft_datetimepicker .xdsoft_timepicker {
display: none;
}
.xdsoft_datetimepicker .xdsoft_datepicker.active, .xdsoft_datetimepicker .xdsoft_timepicker.active {
display: block;
}
.xdsoft_datetimepicker .xdsoft_datepicker {
width: 224px;
float: left;
margin-left: 8px;
}
.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_datepicker {
float: right;
margin-right: 8px;
margin-left: 0;
}
.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_datepicker {
width: 256px;
}
.xdsoft_datetimepicker .xdsoft_timepicker {
width: 58px;
float: left;
text-align: center;
margin-left: 8px;
margin-top: 0;
}
.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker {
float: right;
margin-right: 8px;
margin-left: 0;
}
.xdsoft_datetimepicker .xdsoft_datepicker.active+.xdsoft_timepicker {
margin-top: 8px;
margin-bottom: 3px
}
.xdsoft_datetimepicker .xdsoft_monthpicker {
position: relative;
text-align: center;
}
.xdsoft_datetimepicker .xdsoft_label i,
.xdsoft_datetimepicker .xdsoft_prev,
.xdsoft_datetimepicker .xdsoft_next,
.xdsoft_datetimepicker .xdsoft_today_button {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAeCAYAAADaW7vzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0NBRjI1NjM0M0UwMTFFNDk4NkFGMzJFQkQzQjEwRUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0NBRjI1NjQ0M0UwMTFFNDk4NkFGMzJFQkQzQjEwRUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQ0FGMjU2MTQzRTAxMUU0OTg2QUYzMkVCRDNCMTBFQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQ0FGMjU2MjQzRTAxMUU0OTg2QUYzMkVCRDNCMTBFQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoNEP54AAAIOSURBVHja7Jq9TsMwEMcxrZD4WpBYeKUCe+kTMCACHZh4BFfHO/AAIHZGFhYkBBsSEqxsLCAgXKhbXYOTxh9pfJVP+qutnZ5s/5Lz2Y5I03QhWji2GIcgAokWgfCxNvcOCCGKqiSqhUp0laHOne05vdEyGMfkdxJDVjgwDlEQgYQBgx+ULJaWSXXS6r/ER5FBVR8VfGftTKcITNs+a1XpcFoExREIDF14AVIFxgQUS+h520cdud6wNkC0UBw6BCO/HoCYwBhD8QCkQ/x1mwDyD4plh4D6DDV0TAGyo4HcawLIBBSLDkHeH0Mg2yVP3l4TQMZQDDsEOl/MgHQqhMNuE0D+oBh0CIr8MAKyazBH9WyBuKxDWgbXfjNf32TZ1KWm/Ap1oSk/R53UtQ5xTh3LUlMmT8gt6g51Q9p+SobxgJQ/qmsfZhWywGFSl0yBjCLJCMgXail3b7+rumdVJ2YRss4cN+r6qAHDkPWjPjdJCF4n9RmAD/V9A/Wp4NQassDjwlB6XBiCxcJQWmZZb8THFilfy/lfrTvLghq2TqTHrRMTKNJ0sIhdo15RT+RpyWwFdY96UZ/LdQKBGjcXpcc1AlSFEfLmouD+1knuxBDUVrvOBmoOC/rEcN7OQxKVeJTCiAdUzUJhA2Oez9QTkp72OTVcxDcXY8iKNkxGAJXmJCOQwOa6dhyXsOa6XwEGAKdeb5ET3rQdAAAAAElFTkSuQmCC);
}
.xdsoft_datetimepicker .xdsoft_label i {
opacity: 0.5;
background-position: -92px -19px;
display: inline-block;
width: 9px;
height: 20px;
vertical-align: middle;
}
.xdsoft_datetimepicker .xdsoft_prev {
float: left;
background-position: -20px 0;
}
.xdsoft_datetimepicker .xdsoft_today_button {
float: left;
background-position: -70px 0;
margin-left: 5px;
}
.xdsoft_datetimepicker .xdsoft_next {
float: right;
background-position: 0 0;
}
.xdsoft_datetimepicker .xdsoft_next,
.xdsoft_datetimepicker .xdsoft_prev ,
.xdsoft_datetimepicker .xdsoft_today_button {
background-color: transparent;
background-repeat: no-repeat;
border: 0 none;
cursor: pointer;
display: block;
height: 30px;
opacity: 0.5;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
outline: medium none;
overflow: hidden;
padding: 0;
position: relative;
text-indent: 100%;
white-space: nowrap;
width: 20px;
min-width: 0;
}
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev,
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_next {
float: none;
background-position: -40px -15px;
height: 15px;
width: 30px;
display: block;
margin-left: 14px;
margin-top: 7px;
}
.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker .xdsoft_prev,
.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker .xdsoft_next {
float: none;
margin-left: 0;
margin-right: 14px;
}
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev {
background-position: -40px 0;
margin-bottom: 7px;
margin-top: 0;
}
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box {
height: 151px;
overflow: hidden;
border-bottom: 1px solid #ddd;
}
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div {
background: #f5f5f5;
border-top: 1px solid #ddd;
color: #666;
font-size: 12px;
text-align: center;
border-collapse: collapse;
cursor: pointer;
border-bottom-width: 0;
height: 25px;
line-height: 25px;
}
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div > div:first-child {
border-top-width: 0;
}
.xdsoft_datetimepicker .xdsoft_today_button:hover,
.xdsoft_datetimepicker .xdsoft_next:hover,
.xdsoft_datetimepicker .xdsoft_prev:hover {
opacity: 1;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
}
.xdsoft_datetimepicker .xdsoft_label {
display: inline;
position: relative;
z-index: 9999;
margin: 0;
padding: 5px 3px;
font-size: 14px;
line-height: 20px;
font-weight: bold;
background-color: #fff;
float: left;
width: 182px;
text-align: center;
cursor: pointer;
}
.xdsoft_datetimepicker .xdsoft_label:hover>span {
text-decoration: underline;
}
.xdsoft_datetimepicker .xdsoft_label:hover i {
opacity: 1.0;
}
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select {
border: 1px solid #ccc;
position: absolute;
right: 0;
top: 30px;
z-index: 101;
display: none;
background: #fff;
max-height: 160px;
overflow-y: hidden;
}
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_monthselect{ right: -7px }
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_yearselect{ right: 2px }
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover {
color: #fff;
background: #ff8000;
}
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option {
padding: 2px 10px 2px 5px;
text-decoration: none !important;
}
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current {
background: #33aaff;
box-shadow: #178fe5 0 1px 3px 0 inset;
color: #fff;
font-weight: 700;
}
.xdsoft_datetimepicker .xdsoft_month {
width: 100px;
text-align: right;
}
.xdsoft_datetimepicker .xdsoft_calendar {
clear: both;
}
.xdsoft_datetimepicker .xdsoft_year{
width: 48px;
margin-left: 5px;
}
.xdsoft_datetimepicker .xdsoft_calendar table {
border-collapse: collapse;
width: 100%;
}
.xdsoft_datetimepicker .xdsoft_calendar td > div {
padding-right: 5px;
}
.xdsoft_datetimepicker .xdsoft_calendar th {
height: 25px;
}
.xdsoft_datetimepicker .xdsoft_calendar td,.xdsoft_datetimepicker .xdsoft_calendar th {
width: 14.2857142%;
background: #f5f5f5;
border: 1px solid #ddd;
color: #666;
font-size: 12px;
text-align: right;
vertical-align: middle;
padding: 0;
border-collapse: collapse;
cursor: pointer;
height: 25px;
}
.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_calendar td,.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_calendar th {
width: 12.5%;
}
.xdsoft_datetimepicker .xdsoft_calendar th {
background: #f1f1f1;
}
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_today {
color: #33aaff;
}
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_default {
background: #ffe9d2;
box-shadow: #ffb871 0 1px 4px 0 inset;
color: #000;
}
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_mint {
background: #c1ffc9;
box-shadow: #00dd1c 0 1px 4px 0 inset;
color: #000;
}
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_default,
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current,
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_current {
background: #33aaff;
box-shadow: #178fe5 0 1px 3px 0 inset;
color: #fff;
font-weight: 700;
}
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month,
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled,
.xdsoft_datetimepicker .xdsoft_time_box >div >div.xdsoft_disabled {
opacity: 0.5;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
cursor: default;
}
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month.xdsoft_disabled {
opacity: 0.2;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
}
.xdsoft_datetimepicker .xdsoft_calendar td:hover,
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div:hover {
color: #fff !important;
background: #ff8000 !important;
box-shadow: none !important;
}
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current.xdsoft_disabled:hover,
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box>div>div.xdsoft_current.xdsoft_disabled:hover {
background: #33aaff !important;
box-shadow: #178fe5 0 1px 3px 0 inset !important;
color: #fff !important;
}
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled:hover,
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_disabled:hover {
color: inherit !important;
background: inherit !important;
box-shadow: inherit !important;
}
.xdsoft_datetimepicker .xdsoft_calendar th {
font-weight: 700;
text-align: center;
color: #999;
cursor: default;
}
.xdsoft_datetimepicker .xdsoft_copyright {
color: #ccc !important;
font-size: 10px;
clear: both;
float: none;
margin-left: 8px;
}
.xdsoft_datetimepicker .xdsoft_copyright a { color: #eee !important }
.xdsoft_datetimepicker .xdsoft_copyright a:hover { color: #aaa !important }
.xdsoft_time_box {
position: relative;
border: 1px solid #ccc;
}
.xdsoft_scrollbar >.xdsoft_scroller {
background: #ccc !important;
height: 20px;
border-radius: 3px;
}
.xdsoft_scrollbar {
position: absolute;
width: 7px;
right: 0;
top: 0;
bottom: 0;
cursor: pointer;
}
.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_scrollbar {
left: 0;
right: auto;
}
.xdsoft_scroller_box {
position: relative;
}
.xdsoft_datetimepicker.xdsoft_dark {
box-shadow: 0 5px 15px -5px rgba(255, 255, 255, 0.506);
background: #000;
border-bottom: 1px solid #444;
border-left: 1px solid #333;
border-right: 1px solid #333;
border-top: 1px solid #333;
color: #ccc;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box {
border-bottom: 1px solid #222;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div {
background: #0a0a0a;
border-top: 1px solid #222;
color: #999;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label {
background-color: #000;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select {
border: 1px solid #333;
background: #000;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover {
color: #000;
background: #007fff;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current {
background: #cc5500;
box-shadow: #b03e00 0 1px 3px 0 inset;
color: #000;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label i,
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_prev,
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_next,
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_today_button {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAeCAYAAADaW7vzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUExQUUzOTA0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUExQUUzOTE0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQTFBRTM4RTQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQTFBRTM4RjQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pp0VxGEAAAIASURBVHja7JrNSgMxEMebtgh+3MSLr1T1Xn2CHoSKB08+QmR8Bx9A8e7RixdB9CKCoNdexIugxFlJa7rNZneTbLIpM/CnNLsdMvNjM8l0mRCiQ9Ye61IKCAgZAUnH+mU3MMZaHYChBnJUDzWOFZdVfc5+ZFLbrWDeXPwbxIqrLLfaeS0hEBVGIRQCEiZoHQwtlGSByCCdYBl8g8egTTAWoKQMRBRBcZxYlhzhKegqMOageErsCHVkk3hXIFooDgHB1KkHIHVgzKB4ADJQ/A1jAFmAYhkQqA5TOBtocrKrgXwQA8gcFIuAIO8sQSA7hidvPwaQGZSaAYHOUWJABhWWw2EMIH9QagQERU4SArJXo0ZZL18uvaxejXt/Em8xjVBXmvFr1KVm/AJ10tRe2XnraNqaJvKE3KHuUbfK1E+VHB0q40/y3sdQSxY4FHWeKJCunP8UyDdqJZenT3ntVV5jIYCAh20vT7ioP8tpf6E2lfEMwERe+whV1MHjwZB7PBiCxcGQWwKZKD62lfGNnP/1poFAA60T7rF1UgcKd2id3KDeUS+oLWV8DfWAepOfq00CgQabi9zjcgJVYVD7PVzQUAUGAQkbNJTBICDhgwYTjDYD6XeW08ZKh+A4pYkzenOxXUbvZcWz7E8ykRMnIHGX1XPl+1m2vPYpL+2qdb8CDAARlKFEz/ZVkAAAAABJRU5ErkJggg==);
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td,
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
background: #0a0a0a;
border: 1px solid #222;
color: #999;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
background: #0e0e0e;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_today {
color: #cc5500;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_default {
background: #ffe9d2;
box-shadow: #ffb871 0 1px 4px 0 inset;
color:#000;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_mint {
background: #c1ffc9;
box-shadow: #00dd1c 0 1px 4px 0 inset;
color:#000;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_default,
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_current,
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_current {
background: #cc5500;
box-shadow: #b03e00 0 1px 3px 0 inset;
color: #000;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td:hover,
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div:hover {
color: #000 !important;
background: #007fff !important;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
color: #666;
}
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright { color: #333 !important }
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a { color: #111 !important }
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a:hover { color: #555 !important }
.xdsoft_dark .xdsoft_time_box {
border: 1px solid #333;
}
.xdsoft_dark .xdsoft_scrollbar >.xdsoft_scroller {
background: #333 !important;
}
.xdsoft_datetimepicker .xdsoft_save_selected {
display: block;
border: 1px solid #dddddd !important;
margin-top: 5px;
width: 100%;
color: #454551;
font-size: 13px;
}
.xdsoft_datetimepicker .blue-gradient-button {
font-family: "museo-sans", "Book Antiqua", sans-serif;
font-size: 12px;
font-weight: 300;
color: #82878c;
height: 28px;
position: relative;
padding: 4px 17px 4px 33px;
border: 1px solid #d7d8da;
background: -moz-linear-gradient(top, #fff 0%, #f4f8fa 73%);
/* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(73%, #f4f8fa));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #fff 0%, #f4f8fa 73%);
/* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, #fff 0%, #f4f8fa 73%);
/* Opera 11.10+ */
background: -ms-linear-gradient(top, #fff 0%, #f4f8fa 73%);
/* IE10+ */
background: linear-gradient(to bottom, #fff 0%, #f4f8fa 73%);
/* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff', endColorstr='#f4f8fa',GradientType=0 );
/* IE6-9 */
}
.xdsoft_datetimepicker .blue-gradient-button:hover, .xdsoft_datetimepicker .blue-gradient-button:focus, .xdsoft_datetimepicker .blue-gradient-button:hover span, .xdsoft_datetimepicker .blue-gradient-button:focus span {
color: #454551;
background: -moz-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
/* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f4f8fa), color-stop(73%, #FFF));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
/* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
/* Opera 11.10+ */
background: -ms-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
/* IE10+ */
background: linear-gradient(to bottom, #f4f8fa 0%, #FFF 73%);
/* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f8fa', endColorstr='#FFF',GradientType=0 );
/* IE6-9 */
}

1
_src/common/css/global.css

@ -1 +0,0 @@
html, body { min-height:100%; }

200
_src/common/css/toastr.css

@ -1,200 +0,0 @@
.toast-title {
font-weight: bold;
}
.toast-message {
-ms-word-wrap: break-word;
word-wrap: break-word;
}
.toast-message a,
.toast-message label {
color: #ffffff;
}
.toast-message a:hover {
color: #cccccc;
text-decoration: none;
}
.toast-close-button {
position: relative;
right: -0.3em;
top: -0.3em;
float: right;
font-size: 20px;
font-weight: bold;
color: #ffffff;
-webkit-text-shadow: 0 1px 0 #ffffff;
text-shadow: 0 1px 0 #ffffff;
opacity: 0.8;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
filter: alpha(opacity=80);
}
.toast-close-button:hover,
.toast-close-button:focus {
color: #000000;
text-decoration: none;
cursor: pointer;
opacity: 0.4;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);
filter: alpha(opacity=40);
}
/*Additional properties for button version
iOS requires the button element instead of an anchor tag.
If you want the anchor version, it requires `href="#"`.*/
button.toast-close-button {
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
}
.toast-top-center {
top: 0;
right: 0;
width: 100%;
}
.toast-bottom-center {
bottom: 0;
right: 0;
width: 100%;
}
.toast-top-full-width {
top: 0;
right: 0;
width: 100%;
}
.toast-bottom-full-width {
bottom: 0;
right: 0;
width: 100%;
}
.toast-top-left {
top: 12px;
left: 12px;
}
.toast-top-right {
top: 12px;
right: 12px;
}
.toast-bottom-right {
right: 12px;
bottom: 12px;
}
.toast-bottom-left {
bottom: 12px;
left: 12px;
}
#toast-container {
position: fixed;
z-index: 999999;
pointer-events: none;
/*overrides*/
}
#toast-container * {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
#toast-container > div {
position: relative;
pointer-events: auto;
overflow: hidden;
margin: 0 0 6px;
padding: 15px 15px 15px 50px;
width: 300px;
-moz-border-radius: 3px 3px 3px 3px;
-webkit-border-radius: 3px 3px 3px 3px;
border-radius: 3px 3px 3px 3px;
background-position: 15px center;
background-repeat: no-repeat;
-moz-box-shadow: 0 0 12px #999999;
-webkit-box-shadow: 0 0 12px #999999;
box-shadow: 0 0 12px #999999;
color: #ffffff;
opacity: 0.8;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
filter: alpha(opacity=80);
}
#toast-container > :hover {
-moz-box-shadow: 0 0 12px #000000;
-webkit-box-shadow: 0 0 12px #000000;
box-shadow: 0 0 12px #000000;
opacity: 1;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
filter: alpha(opacity=100);
cursor: pointer;
}
#toast-container > .toast-info {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important;
}
#toast-container > .toast-error {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;
}
#toast-container > .toast-success {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;
}
#toast-container > .toast-warning {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;
}
#toast-container.toast-top-center > div,
#toast-container.toast-bottom-center > div {
width: 300px;
margin-left: auto;
margin-right: auto;
}
#toast-container.toast-top-full-width > div,
#toast-container.toast-bottom-full-width > div {
width: 96%;
margin-left: auto;
margin-right: auto;
}
.toast {
background-color: #030303;
}
.toast-success {
background-color: #51a351;
}
.toast-error {
background-color: #bd362f;
}
.toast-info {
background-color: #2f96b4;
}
.toast-warning {
background-color: #f89406;
}
.toast-progress {
position: absolute;
left: 0;
bottom: 0;
height: 4px;
background-color: #000000;
opacity: 0.4;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);
filter: alpha(opacity=40);
}
/*Responsive Design*/
@media all and (max-width: 240px) {
#toast-container > div {
padding: 8px 8px 8px 50px;
width: 11em;
}
#toast-container .toast-close-button {
right: -0.2em;
top: -0.2em;
}
}
@media all and (min-width: 241px) and (max-width: 480px) {
#toast-container > div {
padding: 8px 8px 8px 50px;
width: 18em;
}
#toast-container .toast-close-button {
right: -0.2em;
top: -0.2em;
}
}
@media all and (min-width: 481px) and (max-width: 768px) {
#toast-container > div {
padding: 15px 15px 15px 50px;
width: 25em;
}
}

30
_src/common/js/global.js

@ -4,36 +4,6 @@
if(!window.console || !window.console.log) {window.console = {log : function(){}};} if(!window.console || !window.console.log) {window.console = {log : function(){}};}
var APP = {}; var APP = {};
APP.POPUP = null;
APP.REGEX = {};
APP.REGEX.uniqueID = /^[a-z][a-z0-9_]{2,19}$/g;
(function($) {
APP.POPUP = function(option) {
var defaults={
title : '_blank',
width : 800,
height : 600,
url : ''
};
var options = $.extend({}, defaults, option);
cw = screen.availWidth;
ch = screen.availHeight;
sw = options.width;
sh = options.height;
ml = (cw - sw) / 2;
mt = (ch - sh) / 2;
var option = 'width='+sw+',height='+sh+',top='+mt+',left='+ml+',scrollbars=yes,resizable=no';
var win = window.open(options.url, options.title, option);
if (win == null || typeof(win) == "undefined" || (win == null && win.outerWidth == 0) || (win != null && win.outerHeight == 0))
{
alert("팝업 차단 기능이 설정되어있습니다\n\n차단 기능을 해제(팝업허용) 한 후 다시 이용해 주십시오.");
return;
}
};
})(jQuery);
/** /**
* 언어셋 변경 * 언어셋 변경

0
_src/common/js/board.js → _src/common/js/modules/board.js

126
_src/common/js/modules/components.js

@ -0,0 +1,126 @@
/***********************************************************************************
* AJAX Error BlockUI 처리
***********************************************************************************/
$(function() {
$(document).ajaxError(function(event, request, settings){
var message = '알수없는 오류가 발생하였습니다.';
if( typeof request.responseJSON != 'undefined' && typeof request.responseJSON.message != 'undefined' ) {
message = request.responseJSON.message;
}
else {
if( request.status == 500 ) message = '서버 코드 오류가 발생하였습니다.\n관리자에게 문의하세요';
else if ( request.status == 401 ) message = '해당 명령을 실행할 권한이 없습니다.';
}
toastr.error(message, '오류 발생');
}).ajaxStart(function(){
$.blockUI({
css: {width:'25px',top:'49%',left:'49%',border:'0px none',backgroundColor:'transparent',cursor:'wait'},
message : '<img src="/assets/images/common/ajax-loader.gif" alt="로딩중">',
baseZ : 10000,
overlayCSS : {opacity : 0}
});
}).ajaxComplete(function(){
$.unblockUI();
});
});
/***********************************************************************************************************************
* 전체체크박스 / 체크박스 연동
***********************************************************************************************************************/
$(function() {
$(document).on('change', '[data-checkbox]', function() {
var $check = $(this);
var is_all = $check.data('checkbox-all') != null ? true : false;
var name = $check.data('checkbox');
var checked = $check.prop('checked');
var $allCheck = is_all ? $check : $('[data-checkbox="'+name+'"][data-checkbox-all]');
if( is_all ) {
$('[data-checkbox="'+name+'"]').prop('checked', checked );
}
else {
$allCheck.prop('checked', $('[data-checkbox="'+name+'"]').not('[data-checkbox-all]').length == $('[data-checkbox="'+name+'"]:checked').not('[data-checkbox-all]').length);
}
});
});
/***********************************************************************************************************************
* 숫자 3자리마다 Comma 자동 입력
***********************************************************************************************************************/
$(function() {
$(document).on('keypress', '[data-number-format]', function(e) {
$(this).val( $(this).val().trim().unNumberFormat().numberFormat() );
})
});
/***********************************************************************************************************************
* 숫자만 입력가능한 Input
***********************************************************************************************************************/
$(function() {
$(document).on('keypress', '[data-number-only]', function(e) {
if (e.which != 8 && e.which != 0 && e.which != 45 && (e.which < 48 || e.which > 57)) {
e.preventDefault();
}
})
});
/***********************************************************************************************************************
* 높이 자동조절되는 Textarea
***********************************************************************************************************************/
$(function() {
$(document).on('keyup','textarea[data-autosize]', function(e) {
autosize($(this));
});
$('textarea[data-autosize]').keyup();
});
$(function() {
/***********************************************************************************************************************
* 핸드폰 번호 Input
***********************************************************************************************************************/
$('body').on('keypress', '[data-regex="phone-number"]', function(e){
if (e.which != 8 && e.which != 0 && e.which != 45 && (e.which < 48 || e.which > 57)) {
e.preventDefault();
}
}).on('blur','[data-regex="phone-number"]', function(e){
if($(this).val() == '') return;
var transNum = $(this).val().regex('phone');
if( transNum === false ) {
toastr.error('유효하지 않은 전화번호 입니다.');
$(this).val("");
$(this).focus();
return;
}
$(this).val(transNum);
});
/***********************************************************************************************************************
* 전화번호 Input
***********************************************************************************************************************/
$('body').on('blur', '[data-regex="tel-number"]', function(e){
if($(this).val() == '') return;
var transNum = $(this).val().regex('tel');
if( transNum === false ) {
toastr.error('유효하지 않은 전화번호 입니다.');
$(this).val("");
$(this).focus();
return;
}
$(this).val(transNum);
});
/***********************************************************************************************************************
* 이메일주소 Input
***********************************************************************************************************************/
$('body').on('blur', '[data-regex="email-address"]', function(e){
if($(this).val() == '') return;
var trans_num = $(this).val().regex('email');
if(! trans_num) {
toastr.error('유효하지 않은 이메일주소 입니다.');
$(this).val("");
$(this).focus();
}
});
});

0
_src/admin/js/modules/components.js → _src/common/js/modules/dropdown.js

98
_src/common/js/modules/formatter.js

@ -0,0 +1,98 @@
/**********************************************************************************************************************
* 숫자에 컴마를 붙여서 리턴한다
* @returns {*}
*********************************************************************************************************************/
Number.prototype.numberFormat = function(){
if(this==0) return 0;
var reg = /(^[+-]?\d+)(\d{3})/;
var n = (this + '');
while (reg.test(n)) n = n.replace(reg, '$1' + ',' + '$2');
return n;
};
String.prototype.numberFormat = function() { return isNaN( parseFloat(this) ) ? "0" : (parseFloat(this)).numberFormat(); };
/**********************************************************************************************************************
* 컴마가 붙어있는 숫자에서 콤마를 삭제하고 숫자로 반환한다.
* @returns {*}
*********************************************************************************************************************/
String.prototype.unNumberFormat = function() {
var str = this;
if(typeof str == 'number') return str;
str = ("" + str).replace(/,/gi,''); // 콤마 제거
str = str.replace(/(^\s*)|(\s*$)/g, ""); // trim
var returnStr = new Number(str);
return isNaN(returnStr) ? str : returnStr;
};
Number.prototype.unNumberFormat = function() {
return this;
};
/**********************************************************************************************************************
* 날짜를 원하는 포맷 형식으로 출력
* @param f
* @returns {*}
*********************************************************************************************************************/
Date.prototype.dateFormat = function(f) {
if (!this.valueOf()) return " ";
if (!f) return this;
var weekName = ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"],
shortWeekName = ["일", "월", "화", "수", "목", "금", "토"],
d = this;
return f.replace(/(yyyy|yy|MM|dd|E|hh|mm|ss|a\/p)/gi, function($1) {
switch ($1) {
case "yyyy": return d.getFullYear();
case "yy": return (d.getFullYear() % 1000).zf(2);
case "MM": return (d.getMonth() + 1).zf(2);
case "dd": return d.getDate().zf(2);
case "E": return weekName[d.getDay()];
case "e": return shortWeekName[d.getDay()];
case "HH": return d.getHours().zf(2);
case "hh": return ((h = d.getHours() % 12) ? h : 12).zf(2);
case "mm": return d.getMinutes().zf(2);
case "ss": return d.getSeconds().zf(2);
case "a/p": return d.getHours() < 12 ? "오전" : "오후";
default: return $1;
}
});
};
String.prototype.string = function(len){var s = '', i = 0; while (i++ < len) { s += this; } return s;};
String.prototype.zf = function(len){return "0".string(len - this.length) + this;};
Number.prototype.zf = function(len){return this.toString().zf(len);};
String.prototype.dateFormat = function(f) {
var d = new Date(this);
return ( d == 'Invalid Date') ? '' : d.dateFormat(f);
}
/**********************************************************************************************************************
* 숫자를 한글명으로 바꿔서 보여줍니다.
*********************************************************************************************************************/
Number.prototype.toKorean = function() {
var hanA = new Array("","일","이","삼","사","오","육","칠","팔","구","십"),
danA = new Array("","십","백","천","","십","백","천","","십","백","천","","십","백","천"),
num = new String(this),
result = '';
for(var i=0; i<num.length; i++) {
var str = "",
han = hanA[num.charAt(num.length-(i+1))];
if(han != "") str += han+danA[i];
if(i == 4) str += "만";
if(i == 8) str += "억";
if(i == 12) str += "조";
result = str + result;
}
return result;
}
String.prototype.toKorean = function() {
return (this.unNumberFormat()).toKorean();
}

0
_src/common/js/member.js → _src/common/js/modules/member.js

194
_src/common/js/modules/modal.js

@ -0,0 +1,194 @@
APP.MODAL = function() {
var modalCallback = {};
var defaultCss = {
width: 400,
height: 400,
position: {
left: "center",
top: "middle"
}
};
var defaultOption = $.extend(true, {}, defaultCss, {
iframeLoadingMsg: "",
iframe: {
method: "get",
url: "#"
},
closeToEsc: true,
onStateChanged: function onStateChanged() {
// mask
if (this.state === "open") {
APP.MASK.open();
} else if (this.state === "close") {
APP.MASK.close();
}
},
animateTime: 100,
zIndex: 1001,
absolute: true,
fullScreen: false,
header: {
title: "새로운 윈도우",
btns: {
close: {
label: '<i class="far fa-times"></i>', onClick: function onClick() {
APP.MODAL.callback();
}
}
}
}
});
var open = function(modalConfig) {
modalConfig = $.extend(true, {}, defaultOption, modalConfig);
$(document.body).addClass("modalOpened");
this.modalCallback = modalConfig.callback;
this.modalSendData = modalConfig.sendData;
APP.modal.open(modalConfig);
};
var css = function css(modalCss) {
modalCss = $.extend(true, {}, defaultCss, modalCss);
APP.modal.css(modalCss);
};
var align = function align(modalAlign) {
APP.modal.align(modalAlign);
};
var close = function close(data) {
APP.modal.close();
setTimeout(function () {
$(document.body).removeClass("modalOpened");
}, 500);
};
var minimize = function minimize() {
APP.modal.minimize();
};
var maximize = function maximize() {
APP.modal.maximize();
};
var callback = function callback(data) {
if (this.modalCallback) {
this.modalCallback(data);
}
this.close(data);
};
var getData = function getData() {
if (this.modalSendData) {
return this.modalSendData();
}
};
return {
"open": open,
"css": css,
"align": align,
"close": close,
"minimize": minimize,
"maximize": maximize,
"callback": callback,
"modalCallback": modalCallback,
"getData": getData
};
}();
APP.MODAL2 = function() {
var modalCallback = {};
var defaultCss = {
width: 400,
height: 400,
position: {
left: "center",
top: "middle"
}
};
var defaultOption = $.extend(true, {}, defaultCss, {
iframeLoadingMsg: "",
iframe: {
method: "get",
url: "#"
},
closeToEsc: true,
onStateChanged: function onStateChanged() {
// mask
if (this.state === "open") {
APP.MASK2.open();
} else if (this.state === "close") {
APP.MASK2.close();
}
},
animateTime: 100,
zIndex: 2001,
absolute: true,
fullScreen: false,
header: {
title: "새로운 윈도우",
btns: {
close: {
label: '<i class="far fa-times"></i>', onClick: function onClick() {
APP.MODAL2.callback();
}
}
}
}
});
var open = function(modalConfig) {
modalConfig = $.extend(true, {}, defaultOption, modalConfig);
$(document.body).addClass("modalOpened");
this.modalCallback = modalConfig.callback;
this.modalSendData = modalConfig.sendData;
APP.modal2.open(modalConfig);
};
var css = function css(modalCss) {
modalCss = $.extend(true, {}, defaultCss, modalCss);
APP.modal2.css(modalCss);
};
var align = function align(modalAlign) {
APP.modal2.align(modalAlign);
};
var close = function close(data) {
APP.modal2.close();
setTimeout(function () {
$(document.body).removeClass("modalOpened");
}, 500);
};
var minimize = function minimize() {
APP.modal2.minimize();
};
var maximize = function maximize() {
APP.modal2.maximize();
};
var callback = function callback(data) {
if (this.modalCallback) {
this.modalCallback(data);
}
this.close(data);
};
var getData = function getData() {
if (this.modalSendData) {
return this.modalSendData();
}
};
return {
"open": open,
"css": css,
"align": align,
"close": close,
"minimize": minimize,
"maximize": maximize,
"callback": callback,
"modalCallback": modalCallback,
"getData": getData
};
}();

28
_src/common/js/modules/popup.js

@ -0,0 +1,28 @@
APP.POPUP = null;
(function($) {
APP.POPUP = function(option) {
var defaults={
title : '_blank',
width : 800,
height : 600,
url : ''
};
var options = $.extend({}, defaults, option);
cw = screen.availWidth;
ch = screen.availHeight;
sw = options.width;
sh = options.height;
ml = (cw - sw) / 2;
mt = (ch - sh) / 2;
var option = 'width='+sw+',height='+sh+',top='+mt+',left='+ml+',scrollbars=yes,resizable=no';
var win = window.open(options.url, options.title, option);
if (win == null || typeof(win) == "undefined" || (win == null && win.outerWidth == 0) || (win != null && win.outerHeight == 0))
{
alert("팝업 차단 기능이 설정되어있습니다\n\n차단 기능을 해제(팝업허용) 한 후 다시 이용해 주십시오.");
return;
}
};
})(jQuery);

49
_src/common/js/modules/regex.js

@ -0,0 +1,49 @@
/************************************************************************************************************************
* 해당 문자열의 regex 검사
* @param regexType
*************************************************************************************************************************/
String.prototype.regex = function(regexType) {
var phoneRegex = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})([0-9]{3,4})([0-9]{4})$/,
phoneWithHypenRegex = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})-?([0-9]{3,4})-?([0-9]{4})$/,
telRegex = /(^02.{0}|^01.{1}|[0-9]{3})([0-9]{3,4})([0-9]{4})/,
telCheckRegex = /^\d{2,3}-\d{3,4}-\d{4}$/,
uniqueID = /^[a-z][a-z0-9_]{2,19}$/g,
emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
str = this;
switch(regexType) {
case "phone" :
var transNum = str.replace(/\s/gi, '').replace(/-/gi,'');
if(transNum.length == 11 || transNum.length == 10) {
if( phoneRegex.test(transNum) ) {
transNum = transNum.replace(phoneWithHypenRegex, '$1-$2-$3');
return transNum;
}
}
return false;
case "tel":
var transNum = str.replace(/\s/gi, '').replace(/-/gi,'');
transNum = transNum.replace(telRegex, '$1-$2-$3');
if(telCheckRegex.test(transNum)) {
return transNum;
}
return false;
case "email":
return emailRegex.test(str);
case "biznum" :
var checkID = new Array(1, 3, 7, 1, 3, 7, 1, 3, 5, 1),
tmpBizID, i, chkSum=0, c2, remander,
bizID = str.replace(/-/gi,'');
for (i=0; i<=7; i++) chkSum += checkID[i] * bizID.charAt(i);
c2 = "0" + (checkID[8] * bizID.charAt(8));
c2 = c2.substring(c2.length - 2, c2.length);
chkSum += Math.floor(c2.charAt(0)) + Math.floor(c2.charAt(1));
remander = (10 - (chkSum % 10)) % 10 ;
if (Math.floor(bizID.charAt(9)) == remander) return bizID.replace(/(\d{3})(\d{2})(\d{5})/, '$1-$2-$3');
return false;
case "uniqid" :
return uniqueID.test(str);
}
};

288
_src/common/js/plugins/autosize.js

@ -0,0 +1,288 @@
/*!
autosize 4.0.2
license: MIT
http://www.jacklmoore.com/autosize
*/
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(['module', 'exports'], factory);
} else if (typeof exports !== "undefined") {
factory(module, exports);
} else {
var mod = {
exports: {}
};
factory(mod, mod.exports);
global.autosize = mod.exports;
}
})(this, function (module, exports) {
'use strict';
var map = typeof Map === "function" ? new Map() : function () {
var keys = [];
var values = [];
return {
has: function has(key) {
return keys.indexOf(key) > -1;
},
get: function get(key) {
return values[keys.indexOf(key)];
},
set: function set(key, value) {
if (keys.indexOf(key) === -1) {
keys.push(key);
values.push(value);
}
},
delete: function _delete(key) {
var index = keys.indexOf(key);
if (index > -1) {
keys.splice(index, 1);
values.splice(index, 1);
}
}
};
}();
var createEvent = function createEvent(name) {
return new Event(name, { bubbles: true });
};
try {
new Event('test');
} catch (e) {
// IE does not support `new Event()`
createEvent = function createEvent(name) {
var evt = document.createEvent('Event');
evt.initEvent(name, true, false);
return evt;
};
}
function assign(ta) {
if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return;
var heightOffset = null;
var clientWidth = null;
var cachedHeight = null;
function init() {
var style = window.getComputedStyle(ta, null);
if (style.resize === 'vertical') {
ta.style.resize = 'none';
} else if (style.resize === 'both') {
ta.style.resize = 'horizontal';
}
if (style.boxSizing === 'content-box') {
heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom));
} else {
heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);
}
// Fix when a textarea is not on document body and heightOffset is Not a Number
if (isNaN(heightOffset)) {
heightOffset = 0;
}
update();
}
function changeOverflow(value) {
{
// Chrome/Safari-specific fix:
// When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space
// made available by removing the scrollbar. The following forces the necessary text reflow.
var width = ta.style.width;
ta.style.width = '0px';
// Force reflow:
/* jshint ignore:start */
ta.offsetWidth;
/* jshint ignore:end */
ta.style.width = width;
}
ta.style.overflowY = value;
}
function getParentOverflows(el) {
var arr = [];
while (el && el.parentNode && el.parentNode instanceof Element) {
if (el.parentNode.scrollTop) {
arr.push({
node: el.parentNode,
scrollTop: el.parentNode.scrollTop
});
}
el = el.parentNode;
}
return arr;
}
function resize() {
if (ta.scrollHeight === 0) {
// If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM.
return;
}
var overflows = getParentOverflows(ta);
var docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240)
ta.style.height = '';
ta.style.height = ta.scrollHeight + heightOffset + 'px';
// used to check if an update is actually necessary on window.resize
clientWidth = ta.clientWidth;
// prevents scroll-position jumping
overflows.forEach(function (el) {
el.node.scrollTop = el.scrollTop;
});
if (docTop) {
document.documentElement.scrollTop = docTop;
}
}
function update() {
resize();
var styleHeight = Math.round(parseFloat(ta.style.height));
var computed = window.getComputedStyle(ta, null);
// Using offsetHeight as a replacement for computed.height in IE, because IE does not account use of border-box
var actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(computed.height)) : ta.offsetHeight;
// The actual height not matching the style height (set via the resize method) indicates that
// the max-height has been exceeded, in which case the overflow should be allowed.
if (actualHeight < styleHeight) {
if (computed.overflowY === 'hidden') {
changeOverflow('scroll');
resize();
actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;
}
} else {
// Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands.
if (computed.overflowY !== 'hidden') {
changeOverflow('hidden');
resize();
actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;
}
}
if (cachedHeight !== actualHeight) {
cachedHeight = actualHeight;
var evt = createEvent('autosize:resized');
try {
ta.dispatchEvent(evt);
} catch (err) {
// Firefox will throw an error on dispatchEvent for a detached element
// https://bugzilla.mozilla.org/show_bug.cgi?id=889376
}
}
}
var pageResize = function pageResize() {
if (ta.clientWidth !== clientWidth) {
update();
}
};
var destroy = function (style) {
window.removeEventListener('resize', pageResize, false);
ta.removeEventListener('input', update, false);
ta.removeEventListener('keyup', update, false);
ta.removeEventListener('autosize:destroy', destroy, false);
ta.removeEventListener('autosize:update', update, false);
Object.keys(style).forEach(function (key) {
ta.style[key] = style[key];
});
map.delete(ta);
}.bind(ta, {
height: ta.style.height,
resize: ta.style.resize,
overflowY: ta.style.overflowY,
overflowX: ta.style.overflowX,
wordWrap: ta.style.wordWrap
});
ta.addEventListener('autosize:destroy', destroy, false);
// IE9 does not fire onpropertychange or oninput for deletions,
// so binding to onkeyup to catch most of those events.
// There is no way that I know of to detect something like 'cut' in IE9.
if ('onpropertychange' in ta && 'oninput' in ta) {
ta.addEventListener('keyup', update, false);
}
window.addEventListener('resize', pageResize, false);
ta.addEventListener('input', update, false);
ta.addEventListener('autosize:update', update, false);
ta.style.overflowX = 'hidden';
ta.style.wordWrap = 'break-word';
map.set(ta, {
destroy: destroy,
update: update
});
init();
}
function destroy(ta) {
var methods = map.get(ta);
if (methods) {
methods.destroy();
}
}
function update(ta) {
var methods = map.get(ta);
if (methods) {
methods.update();
}
}
var autosize = null;
// Do nothing in Node.js environment and IE8 (or lower)
if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') {
autosize = function autosize(el) {
return el;
};
autosize.destroy = function (el) {
return el;
};
autosize.update = function (el) {
return el;
};
} else {
autosize = function autosize(el, options) {
if (el) {
Array.prototype.forEach.call(el.length ? el : [el], function (x) {
return assign(x, options);
});
}
return el;
};
autosize.destroy = function (el) {
if (el) {
Array.prototype.forEach.call(el.length ? el : [el], destroy);
}
return el;
};
autosize.update = function (el) {
if (el) {
Array.prototype.forEach.call(el.length ? el : [el], update);
}
return el;
};
}
exports.default = autosize;
module.exports = exports['default'];
});

5
_src/admin/scss/boot/_function.scss → _src/common/scss/_function.scss

@ -11,3 +11,8 @@
@return #f8f9fa; @return #f8f9fa;
} }
} }
@function REM($pxSize:16px){
$remSize : $pxSize / $font-size-base !global;
@return #{$remSize}rem;
}

33
_src/admin/scss/boot/_mixins.scss → _src/common/scss/_mixins.scss

@ -13,8 +13,39 @@
} }
} }
@mixin button-default() {
display: inline-block;
margin:0;
font-weight: normal;
text-align: center;
white-space: nowrap;
user-select: none;
text-decoration: none;
outline:0;
vertical-align:middle;
&:disabled,
&.disabled {
opacity:0.65;
}
&:not([disabled]):not(.disabled) {
cursor: pointer;
}
}
// background Image
@mixin background-image( $image_url, $bg_color:transparent, $background-repeat:no-repeat, $background-position-x:center, $background-position-y:center )
{
background-color:$bg_color;
background-image:url($image_url);
background-repeat: $background-repeat;
background-position-x:$background-position-x;
background-position-y:$background-position-y;
}
// Global Transition // Global Transition
@mixin transition($second:.3s, $target:all, $animation:$default-animation)
@mixin transition($second:.3s, $target:all, $animation: ease)
{ {
-webkit-transition: $target $second $animation; -webkit-transition: $target $second $animation;
-moz-transition: $target $second $animation; -moz-transition: $target $second $animation;

130
_src/admin/scss/boot/_reset.scss → _src/common/scss/_reset.scss

@ -1,6 +1,3 @@
/**********************************************************************************************************************
* RESET
***********************************************************************************************************************/
*, *,
*::before, *::before,
*::after { *::after {
@ -8,34 +5,24 @@
} }
html { html {
font-family: sans-serif; // 2
line-height: 1.15; // 3
-webkit-text-size-adjust: 100%; // 4
-ms-text-size-adjust: 100%; // 4
-ms-overflow-style: scrollbar; // 5
-webkit-tap-highlight-color: rgba(#000, 0); // 6
}
// IE10+ 에서 viewport 메타 태그가 먹지않는경우를 대비
@at-root {
@-ms-viewport {
width: device-width;
}
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
font-size:14px;
} }
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
display: block; display: block;
} }
body { body {
margin: 0; margin: 0;
font-family: $font-family-base;
font-size: $font-size-base;
font-weight: $font-weight-base;
line-height: $line-height-base;
color: $body-color;
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
text-align: left; text-align: left;
background-color: $body-bg-color;
background-color: #fff;
} }
[tabindex="-1"]:focus { [tabindex="-1"]:focus {
@ -49,44 +36,38 @@ hr {
} }
h1, h2, h3, h4, h5, h6 { h1, h2, h3, h4, h5, h6 {
margin:0;
font-family:$font-family-heading;
margin-top: 0;
margin-bottom: 0.5rem;
} }
p { p {
margin:0;
margin-top: 0;
margin-bottom: 1rem;
} }
abbr[title], abbr[title],
abbr[data-original-title] { abbr[data-original-title] {
text-decoration: underline; text-decoration: underline;
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted; text-decoration: underline dotted;
cursor: help; // 3
border-bottom: 0; // 1
cursor: help;
border-bottom: 0;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
} }
address { address {
margin:0;
margin-bottom: 1rem;
font-style: normal; font-style: normal;
line-height: inherit; line-height: inherit;
} }
ol, ol,
ul, ul,
dl { dl {
margin:0; margin:0;
} }
ol ol,
ul ul,
ol ul,
ul ol {
margin:0;
}
dt { dt {
font-weight: $font-weight-base;
font-weight: 700;
} }
dd { dd {
@ -94,16 +75,12 @@ dd {
} }
blockquote { blockquote {
margin:0;
}
dfn {
font-style: italic;
margin: 0;
} }
b, b,
strong { strong {
font-weight: $font-weight-bold;
font-weight: 700;
} }
small { small {
@ -118,22 +95,25 @@ sup {
vertical-align: baseline; vertical-align: baseline;
} }
sub { bottom: -.25em; }
sup { top: -.5em; }
sub {
bottom: -.25em;
}
sup {
top: -.5em;
}
// 링크
a { a {
color: $link-color;
color: #007bff;
text-decoration: none; text-decoration: none;
background-color: transparent; background-color: transparent;
-webkit-text-decoration-skip: objects;
&:hover { &:hover {
color: $link-hover-color;
text-decoration:none;
color: #0056b3;
text-decoration: none;
} }
&:not([href]):not([tabindedx]) {
&:not([href]):not([tabindex]) {
color: inherit; color: inherit;
text-decoration: none; text-decoration: none;
@ -144,27 +124,24 @@ a {
} }
&:focus { &:focus {
outline: 0;
outline:0;
} }
} }
} }
// 코드 관련
pre, pre,
code, code,
kbd, kbd,
samp { samp {
font-family: $font-family-base;
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em; font-size: 1em;
} }
pre { pre {
margin:0; margin:0;
overflow: auto; overflow: auto;
-ms-overflow-style: scrollbar;
} }
// 이미지 관련
figure { figure {
margin: 0; margin: 0;
} }
@ -174,19 +151,19 @@ img {
border-style: none; border-style: none;
} }
svg:not(:root) {
svg {
overflow: hidden; overflow: hidden;
vertical-align: middle;
} }
// 테이블 관련
table { table {
border-collapse: collapse; border-collapse: collapse;
} }
caption { caption {
padding-top: $table-cell-padding;
padding-bottom: $table-cell-padding;
color: $body-color;
padding-top: 0.75rem;
padding-bottom: 0.75rem;
color: #6c757d;
text-align: left; text-align: left;
caption-side: bottom; caption-side: bottom;
} }
@ -195,19 +172,18 @@ th {
text-align: inherit; text-align: inherit;
} }
// 폼관련
label { label {
display: inline-block; display: inline-block;
margin:0;
margin-bottom: 0.5rem;
} }
button { button {
border-radius: 0; border-radius: 0;
}
&:focus {
button:focus {
outline: 1px dotted; outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color; outline: 5px auto -webkit-focus-ring-color;
}
} }
input, input,
@ -231,13 +207,24 @@ select {
text-transform: none; text-transform: none;
} }
select {
word-wrap: normal;
}
button, button,
html [type="button"],
[type="button"],
[type="reset"], [type="reset"],
[type="submit"] { [type="submit"] {
-webkit-appearance: button; -webkit-appearance: button;
} }
button:not(:disabled),
[type="button"]:not(:disabled),
[type="reset"]:not(:disabled),
[type="submit"]:not(:disabled) {
cursor: pointer;
}
button::-moz-focus-inner, button::-moz-focus-inner,
[type="button"]::-moz-focus-inner, [type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner,
@ -276,7 +263,7 @@ legend {
width: 100%; width: 100%;
max-width: 100%; max-width: 100%;
padding: 0; padding: 0;
margin:0;
margin-bottom: .5rem;
font-size: 1.5rem; font-size: 1.5rem;
line-height: inherit; line-height: inherit;
color: inherit; color: inherit;
@ -297,18 +284,15 @@ progress {
-webkit-appearance: none; -webkit-appearance: none;
} }
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration { [type="search"]::-webkit-search-decoration {
-webkit-appearance: none; -webkit-appearance: none;
} }
::-webkit-file-upload-button { ::-webkit-file-upload-button {
font: inherit; font: inherit;
-webkit-appearance: button; -webkit-appearance: button;
} }
output { output {
display: inline-block; display: inline-block;
} }

98
_src/common/scss/_utility.scss

@ -0,0 +1,98 @@
.ellipsis { text-overflow:ellipsis; white-space:nowrap; word-wrap:normal; overflow:hidden; }
.admin-help-wrap {
width:700px; margin:0 auto;
li > img {width:700px;}
.point-color {color:#e60035}
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
&.sr-only-focusable {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
overflow: visible;
clip: auto;
white-space: normal;
}
}
}
.clearfix {
&,
&:before,
&:after {
@include clear-fix();
}
}
/* 높이/너비/마진/패딩 */
@for $i from 1 to 201 {
.H#{$i * 5} {
height: 5px * $i !important;
}
}
@for $i from 1 to 201{
.W#{$i * 5} {
width: 5px * $i !important;
}
}
@for $i from 1 to 10 {
.M#{$i * 5} {
margin:5px * $i;
}
.MT#{$i * 5} {
margin-top:5px * $i;
}
.MR#{$i*5} {
margin-right:5px * $i;
}
.MB#{$i * 5} {
margin-bottom:5px * $i;
}
.ML#{$i * 5} {
margin-left:5px * $i;
}
.PT#{$i * 5} {
padding-top:5px * $i;
}
.PR#{$i * 5} {
padding-right:5px * $i;
}
.PB#{$i * 5} {
padding-bottom:5px * $i;
}
.PL#{$i * 5} {
padding-left:5px * $i;
}
.P#{$i * 5} {
padding:5px * $i;
}
}
.text-center {
text-align:center !important;
}
.text-left {
text-align:left !important;
}
.text-right {
text-align:right !important;
}
.margin-auto {
margin-left:auto;
margin-right:auto;
}

15
_src/common/scss/global.scss

@ -0,0 +1,15 @@
@import "reset";
@import "mixins";
@import "function";
@import "plugins/fontawesome5/fontawesome";
@import "plugins/fontawesome5/regular";
@import "plugins/fontawesome5/light";
@import "plugins/fontawesome5/solid";
@import "plugins/fontawesome5/brands";
@import "plugins/toastr";
@import "plugins/ax5ui/ax5";
@import "plugins/ax5ui/ax5mask";
@import "plugins/ax5ui/ax5modal";
@import "utility";

0
_src/desktop/scss/plugins/_toastr.scss → _src/common/scss/plugins/_toastr.scss

0
_src/admin/scss/plugins/ax5ui/_ax5.scss → _src/common/scss/plugins/ax5ui/_ax5.scss

0
_src/admin/scss/plugins/ax5ui/_ax5mask.scss → _src/common/scss/plugins/ax5ui/_ax5mask.scss

0
_src/admin/scss/plugins/ax5ui/_ax5modal.scss → _src/common/scss/plugins/ax5ui/_ax5modal.scss

0
_src/admin/scss/plugins/ax5ui/_bourbon_support.scss → _src/common/scss/plugins/ax5ui/_bourbon_support.scss

0
_src/admin/scss/plugins/ax5ui/_mixin.scss → _src/common/scss/plugins/ax5ui/_mixin.scss

0
_src/admin/scss/plugins/fontawesome5/_animated.scss → _src/common/scss/plugins/fontawesome5/_animated.scss

0
_src/admin/scss/plugins/fontawesome5/_bordered-pulled.scss → _src/common/scss/plugins/fontawesome5/_bordered-pulled.scss

0
_src/admin/scss/plugins/fontawesome5/_core.scss → _src/common/scss/plugins/fontawesome5/_core.scss

0
_src/admin/scss/plugins/fontawesome5/_fixed-width.scss → _src/common/scss/plugins/fontawesome5/_fixed-width.scss

293
_src/common/scss/plugins/fontawesome5/_icons.scss
File diff suppressed because it is too large
View File

0
_src/admin/scss/plugins/fontawesome5/_larger.scss → _src/common/scss/plugins/fontawesome5/_larger.scss

0
_src/admin/scss/plugins/fontawesome5/_list.scss → _src/common/scss/plugins/fontawesome5/_list.scss

1
_src/admin/scss/plugins/fontawesome5/_mixins.scss → _src/common/scss/plugins/fontawesome5/_mixins.scss

@ -9,7 +9,6 @@
font-variant: normal; font-variant: normal;
font-weight: normal; font-weight: normal;
line-height: 1; line-height: 1;
vertical-align: -.125em;
} }
@mixin fa-icon-rotate($degrees, $rotation) { @mixin fa-icon-rotate($degrees, $rotation) {

5
_src/desktop/scss/plugins/fontawesome5/_rotated-flipped.scss → _src/common/scss/plugins/fontawesome5/_rotated-flipped.scss

@ -7,7 +7,7 @@
.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
.#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(-1, -1, 2); }
.#{$fa-css-prefix}-flip-both, .#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(-1, -1, 2); }
// Hook for IE8-9 // Hook for IE8-9
// ------------------------- // -------------------------
@ -17,7 +17,8 @@
.#{$fa-css-prefix}-rotate-180, .#{$fa-css-prefix}-rotate-180,
.#{$fa-css-prefix}-rotate-270, .#{$fa-css-prefix}-rotate-270,
.#{$fa-css-prefix}-flip-horizontal, .#{$fa-css-prefix}-flip-horizontal,
.#{$fa-css-prefix}-flip-vertical {
.#{$fa-css-prefix}-flip-vertical,
.#{$fa-css-prefix}-flip-both {
filter: none; filter: none;
} }
} }

0
_src/admin/scss/plugins/fontawesome5/_screen-reader.scss → _src/common/scss/plugins/fontawesome5/_screen-reader.scss

0
_src/admin/scss/plugins/fontawesome5/_shims.scss → _src/common/scss/plugins/fontawesome5/_shims.scss

0
_src/admin/scss/plugins/fontawesome5/_stacked.scss → _src/common/scss/plugins/fontawesome5/_stacked.scss

296
_src/common/scss/plugins/fontawesome5/_variables.scss
File diff suppressed because it is too large
View File

3
_src/desktop/scss/plugins/fontawesome5/brands.scss → _src/common/scss/plugins/fontawesome5/brands.scss

@ -1,5 +1,5 @@
/*! /*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* Font Awesome Pro 5.9.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License) * License - https://fontawesome.com/license (Commercial License)
*/ */
@import 'variables'; @import 'variables';
@ -8,6 +8,7 @@
font-family: 'Font Awesome 5 Brands'; font-family: 'Font Awesome 5 Brands';
font-style: normal; font-style: normal;
font-weight: normal; font-weight: normal;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-brands-400.eot'); src: url('#{$fa-font-path}/fa-brands-400.eot');
src: url('#{$fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'), src: url('#{$fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'), url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'),

2
_src/mobile/scss/plugins/fontawesome5/fontawesome.scss → _src/common/scss/plugins/fontawesome5/fontawesome.scss

@ -1,5 +1,5 @@
/*! /*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* Font Awesome Pro 5.9.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License) * License - https://fontawesome.com/license (Commercial License)
*/ */
@import 'variables'; @import 'variables';

3
_src/mobile/scss/plugins/fontawesome5/light.scss → _src/common/scss/plugins/fontawesome5/light.scss

@ -1,5 +1,5 @@
/*! /*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* Font Awesome Pro 5.9.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License) * License - https://fontawesome.com/license (Commercial License)
*/ */
@import 'variables'; @import 'variables';
@ -8,6 +8,7 @@
font-family: 'Font Awesome 5 Pro'; font-family: 'Font Awesome 5 Pro';
font-style: normal; font-style: normal;
font-weight: 300; font-weight: 300;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-light-300.eot'); src: url('#{$fa-font-path}/fa-light-300.eot');
src: url('#{$fa-font-path}/fa-light-300.eot?#iefix') format('embedded-opentype'), src: url('#{$fa-font-path}/fa-light-300.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-light-300.woff2') format('woff2'), url('#{$fa-font-path}/fa-light-300.woff2') format('woff2'),

3
_src/admin/scss/plugins/fontawesome5/regular.scss → _src/common/scss/plugins/fontawesome5/regular.scss

@ -1,5 +1,5 @@
/*! /*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* Font Awesome Pro 5.9.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License) * License - https://fontawesome.com/license (Commercial License)
*/ */
@import 'variables'; @import 'variables';
@ -8,6 +8,7 @@
font-family: 'Font Awesome 5 Pro'; font-family: 'Font Awesome 5 Pro';
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-regular-400.eot'); src: url('#{$fa-font-path}/fa-regular-400.eot');
src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'), src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'), url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),

3
_src/desktop/scss/plugins/fontawesome5/solid.scss → _src/common/scss/plugins/fontawesome5/solid.scss

@ -1,5 +1,5 @@
/*! /*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* Font Awesome Pro 5.9.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License) * License - https://fontawesome.com/license (Commercial License)
*/ */
@import 'variables'; @import 'variables';
@ -8,6 +8,7 @@
font-family: 'Font Awesome 5 Pro'; font-family: 'Font Awesome 5 Pro';
font-style: normal; font-style: normal;
font-weight: 900; font-weight: 900;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-solid-900.eot'); src: url('#{$fa-font-path}/fa-solid-900.eot');
src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'), src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'), url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),

2
_src/admin/scss/plugins/fontawesome5/v4-shims.scss → _src/common/scss/plugins/fontawesome5/v4-shims.scss

@ -1,5 +1,5 @@
/*! /*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* Font Awesome Pro 5.9.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License) * License - https://fontawesome.com/license (Commercial License)
*/ */
@import 'variables'; @import 'variables';

5
_src/desktop/scss/boot/_function.scss

@ -1,5 +0,0 @@
// 기본 픽셀 사이즈를 rem 단위 사이즈로 변환
@function REM($pxSize:16px){
$remSize : $pxSize / $font-size-base !global;
@return #{$remSize}rem;
}

56
_src/desktop/scss/boot/_mixins.scss

@ -1,56 +0,0 @@
// Clear FIX
@mixin clear-fix() {
display:block;
clear:both;
content:"";
}
// Button Default Style
@mixin button-default() {
display: inline-block;
margin:0;
font-weight: normal;
text-align: center;
white-space: nowrap;
user-select: none;
text-decoration: none;
outline:0;
vertical-align:middle;
&:disabled,
&.disabled {
opacity:0.65;
}
&:not([disabled]):not(.disabled) {
cursor: pointer;
}
}
// background Image
@mixin background-image( $image_url, $bg_color:transparent, $background-repeat:no-repeat, $background-position-x:center, $background-position-y:center )
{
background-color:$bg_color;
background-image:url($image_url);
background-repeat: $background-repeat;
background-position-x:$background-position-x;
background-position-y:$background-position-y;
}
// Global Transition
@mixin transition($second:.3s, $target:all, $animation:$default-animation)
{
-webkit-transition: $target $second $animation;
-moz-transition: $target $second $animation;
-ms-transition: $target $second $animation;
-o-transition: $target $second $animation;
transition: $target $second $animation;
}
// Display flex & Prefix
@mixin display-flex()
{
-webkit-display:flex;
display:-ms-flex;
display:flex;
}

74
_src/desktop/scss/common/_utility.scss

@ -1,77 +1,3 @@
/*************************************************************************************** /***************************************************************************************
* 유틸리티 * 유틸리티
****************************************************************************************/ ****************************************************************************************/
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
&.sr-only-focusable {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
overflow: visible;
clip: auto;
white-space: normal;
}
}
}
.clearfix {
&,
&:before,
&:after {
@include clear-fix();
}
}
/* 높이/너비/마진/패딩 */
@for $i from 2 to 10 {
.H#{$i * 5} {
height: 5px * $i !important;
}
}
@for $i from 2 to 20 {
.W#{$i * 25} {
width: 25px * $i !important;
}
}
@for $i from 1 to 10 {
.M#{$i * 5} {
margin:5px * $i;
}
.MT#{$i * 5} {
margin-top:5px * $i;
}
.MR#{$i*5} {
margin-right:5px * $i;
}
.MB#{$i * 5} {
margin-bottom:5px * $i;
}
.ML#{$i * 5} {
margin-left:5px * $i;
}
.PT#{$i * 5} {
padding-top:5px * $i;
}
.PR#{$i * 5} {
padding-right:5px * $i;
}
.PB#{$i * 5} {
padding-bottom:5px * $i;
}
.PL#{$i * 5} {
padding-left:5px * $i;
}
.P#{$i * 5} {
padding:5px * $i;
}
}

10
_src/desktop/scss/desktop.scss

@ -2,10 +2,8 @@
// 기본 // 기본
@import "boot/fonts"; @import "boot/fonts";
@import "boot/mixins";
@import "boot/function";
@import "../../common/scss/global";
@import "variables"; @import "variables";
@import "boot/reset";
// 애니메이션,레이아웃,유틸리티,컴포넌트 // 애니메이션,레이아웃,유틸리티,컴포넌트
@import "common/animation"; @import "common/animation";
@ -18,12 +16,6 @@
@import "components/popup_layer"; @import "components/popup_layer";
// 각종 플러그인 SCSS 플러그인 커스텀 // 각종 플러그인 SCSS 플러그인 커스텀
@import "plugins/toastr";
@import "plugins/fontawesome5/fontawesome";
@import "plugins/fontawesome5/regular";
@import "plugins/fontawesome5/light";
@import "plugins/fontawesome5/solid";
@import "plugins/fontawesome5/brands";
// 게시판 스킨 // 게시판 스킨
@import "skins/board/basic"; @import "skins/board/basic";

20
_src/desktop/scss/plugins/fontawesome5/_animated.scss

@ -1,20 +0,0 @@
// Animated Icons
// --------------------------
.#{$fa-css-prefix}-spin {
animation: fa-spin 2s infinite linear;
}
.#{$fa-css-prefix}-pulse {
animation: fa-spin 1s infinite steps(8);
}
@keyframes fa-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}

20
_src/desktop/scss/plugins/fontawesome5/_bordered-pulled.scss

@ -1,20 +0,0 @@
// Bordered & Pulled
// -------------------------
.#{$fa-css-prefix}-border {
border: solid .08em $fa-border-color;
border-radius: .1em;
padding: .2em .25em .15em;
}
.#{$fa-css-prefix}-pull-left { float: left; }
.#{$fa-css-prefix}-pull-right { float: right; }
.#{$fa-css-prefix},
.fas,
.far,
.fal,
.fab {
&.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
&.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
}

20
_src/desktop/scss/plugins/fontawesome5/_core.scss

@ -1,20 +0,0 @@
// Base Class Definition
// -------------------------
.#{$fa-css-prefix},
.fas,
.far,
.fal,
.fab {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: inline-block;
font-style: normal;
font-variant: normal;
text-rendering: auto;
line-height: 1;
}
%fa-icon {
@include fa-icon;
}

6
_src/desktop/scss/plugins/fontawesome5/_fixed-width.scss

@ -1,6 +0,0 @@
// Fixed Width Icons
// -------------------------
.#{$fa-css-prefix}-fw {
text-align: center;
width: $fa-fw-width;
}

1786
_src/desktop/scss/plugins/fontawesome5/_icons.scss
File diff suppressed because it is too large
View File

23
_src/desktop/scss/plugins/fontawesome5/_larger.scss

@ -1,23 +0,0 @@
// Icon Sizes
// -------------------------
// makes the font 33% larger relative to the icon container
.#{$fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -.0667em;
}
.#{$fa-css-prefix}-xs {
font-size: .75em;
}
.#{$fa-css-prefix}-sm {
font-size: .875em;
}
@for $i from 1 through 10 {
.#{$fa-css-prefix}-#{$i}x {
font-size: $i * 1em;
}
}

18
_src/desktop/scss/plugins/fontawesome5/_list.scss

@ -1,18 +0,0 @@
// List Icons
// -------------------------
.#{$fa-css-prefix}-ul {
list-style-type: none;
margin-left: $fa-li-width * 5/4;
padding-left: 0;
> li { position: relative; }
}
.#{$fa-css-prefix}-li {
left: -$fa-li-width;
position: absolute;
text-align: center;
width: $fa-li-width;
line-height: inherit;
}

57
_src/desktop/scss/plugins/fontawesome5/_mixins.scss

@ -1,57 +0,0 @@
// Mixins
// --------------------------
@mixin fa-icon {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
display: inline-block;
font-style: normal;
font-variant: normal;
font-weight: normal;
line-height: 1;
vertical-align: -.125em;
}
@mixin fa-icon-rotate($degrees, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
transform: rotate($degrees);
}
@mixin fa-icon-flip($horiz, $vert, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
transform: scale($horiz, $vert);
}
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
@mixin sr-only {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
@mixin sr-only-focusable {
&:active,
&:focus {
clip: auto;
height: auto;
margin: 0;
overflow: visible;
position: static;
width: auto;
}
}

5
_src/desktop/scss/plugins/fontawesome5/_screen-reader.scss

@ -1,5 +0,0 @@
// Screen Readers
// -------------------------
.sr-only { @include sr-only; }
.sr-only-focusable { @include sr-only-focusable; }

2062
_src/desktop/scss/plugins/fontawesome5/_shims.scss
File diff suppressed because it is too large
View File

31
_src/desktop/scss/plugins/fontawesome5/_stacked.scss

@ -1,31 +0,0 @@
// Stacked Icons
// -------------------------
.#{$fa-css-prefix}-stack {
display: inline-block;
height: 2em;
line-height: 2em;
position: relative;
vertical-align: middle;
width: ($fa-fw-width*2);
}
.#{$fa-css-prefix}-stack-1x,
.#{$fa-css-prefix}-stack-2x {
left: 0;
position: absolute;
text-align: center;
width: 100%;
}
.#{$fa-css-prefix}-stack-1x {
line-height: inherit;
}
.#{$fa-css-prefix}-stack-2x {
font-size: 2em;
}
.#{$fa-css-prefix}-inverse {
color: $fa-inverse;
}

1800
_src/desktop/scss/plugins/fontawesome5/_variables.scss
File diff suppressed because it is too large
View File

16
_src/desktop/scss/plugins/fontawesome5/fontawesome.scss

@ -1,16 +0,0 @@
/*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@import 'mixins';
@import 'core';
@import 'larger';
@import 'fixed-width';
@import 'list';
@import 'bordered-pulled';
@import 'animated';
@import 'rotated-flipped';
@import 'stacked';
@import 'icons';
@import 'screen-reader';

22
_src/desktop/scss/plugins/fontawesome5/light.scss

@ -1,22 +0,0 @@
/*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@font-face {
font-family: 'Font Awesome 5 Pro';
font-style: normal;
font-weight: 300;
src: url('#{$fa-font-path}/fa-light-300.eot');
src: url('#{$fa-font-path}/fa-light-300.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-light-300.woff2') format('woff2'),
url('#{$fa-font-path}/fa-light-300.woff') format('woff'),
url('#{$fa-font-path}/fa-light-300.ttf') format('truetype'),
url('#{$fa-font-path}/fa-light-300.svg#fontawesome') format('svg');
}
.fal {
font-family: 'Font Awesome 5 Pro';
font-weight: 300;
}

22
_src/desktop/scss/plugins/fontawesome5/regular.scss

@ -1,22 +0,0 @@
/*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@font-face {
font-family: 'Font Awesome 5 Pro';
font-style: normal;
font-weight: 400;
src: url('#{$fa-font-path}/fa-regular-400.eot');
src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
url('#{$fa-font-path}/fa-regular-400.woff') format('woff'),
url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'),
url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg');
}
.far {
font-family: 'Font Awesome 5 Pro';
font-weight: 400;
}

6
_src/desktop/scss/plugins/fontawesome5/v4-shims.scss

@ -1,6 +0,0 @@
/*!
* Font Awesome Pro 5.5.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@import 'shims';

5
_src/mobile/scss/boot/_function.scss

@ -1,5 +0,0 @@
// 기본 픽셀 사이즈를 rem 단위 사이즈로 변환
@function REM($pxSize:16px){
$remSize : $pxSize / $font-size-base !global;
@return #{$remSize}rem;
}

56
_src/mobile/scss/boot/_mixins.scss

@ -1,56 +0,0 @@
// Clear FIX
@mixin clear-fix() {
display:block;
clear:both;
content:"";
}
// Button Default Style
@mixin button-default() {
display: inline-block;
margin:0;
font-weight: normal;
text-align: center;
white-space: nowrap;
user-select: none;
text-decoration: none;
outline:0;
vertical-align:middle;
&:disabled,
&.disabled {
opacity:0.65;
}
&:not([disabled]):not(.disabled) {
cursor: pointer;
}
}
// background Image
@mixin background-image( $image_url, $bg_color:transparent, $background-repeat:no-repat, $background-position-x:center, $background-position-y:center )
{
background-color:$bg_color;
background-image:url($image_url);
background-repeat: $background-repeat;
background-position-x:$background-position-x;
background-position-y:$background-position-y;
}
// Global Transition
@mixin transition($second:.3s, $target:all, $animation:$default-animation)
{
-webkit-transition: $target $second $animation;
-moz-transition: $target $second $animation;
-ms-transition: $target $second $animation;
-o-transition: $target $second $animation;
transition: $target $second $animation;
}
// Display flex & Prefix
@mixin display-flex()
{
-webkit-display:flex;
display:-ms-flex;
display:flex;
}

30
_src/mobile/scss/common/_utility.scss

@ -1,33 +1,3 @@
/*************************************************************************************** /***************************************************************************************
* 유틸리티 * 유틸리티
****************************************************************************************/ ****************************************************************************************/
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
&.sr-only-focusable {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
overflow: visible;
clip: auto;
white-space: normal;
}
}
}
.clearfix {
&,
&:before,
&:after {
@include clear-fix();
}
}

10
_src/mobile/scss/mobile.scss

@ -1,9 +1,7 @@
// 기본 // 기본
@import "boot/fonts"; @import "boot/fonts";
@import "boot/mixins";
@import "boot/function";
@import "../../common/scss/global";
@import "variables"; @import "variables";
@import "boot/reset";
// 애니메이션,레이아웃,유틸리티,컴포넌트 // 애니메이션,레이아웃,유틸리티,컴포넌트
@import "common/animation"; @import "common/animation";
@ -15,12 +13,6 @@
@import "components/button"; @import "components/button";
// 각종 플러그인 SCSS 플러그인 커스텀 // 각종 플러그인 SCSS 플러그인 커스텀
@import "plugins/toastr";
@import "plugins/fontawesome5/fontawesome";
@import "plugins/fontawesome5/regular";
@import "plugins/fontawesome5/light";
@import "plugins/fontawesome5/solid";
@import "plugins/fontawesome5/brands";
// 게시판 스킨 // 게시판 스킨
@import "skins/board/basic"; @import "skins/board/basic";

220
_src/mobile/scss/plugins/_toastr.scss

@ -1,220 +0,0 @@
.toast-title {
font-weight: bold;
}
.toast-message {
-ms-word-wrap: break-word;
word-wrap: break-word;
a,
label {
color: #ffffff;
}
a {
&:hover {
color: #cccccc;
text-decoration: none;
}
}
}
.toast-close-button {
position: relative;
right: -0.3em;
top: -0.3em;
float: right;
font-size: 20px;
font-weight: bold;
color: #ffffff;
-webkit-text-shadow: 0 1px 0 #ffffff;
text-shadow: 0 1px 0 #ffffff;
opacity: 0.8;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
filter: alpha(opacity=80);
&:hover,
&:focus {
color: #000000;
text-decoration: none;
cursor: pointer;
opacity: 0.4;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);
filter: alpha(opacity=40);
}
}
button.toast-close-button {
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
}
#toast-container {
position: fixed;
z-index: 999999;
pointer-events: none;
* {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
> div {
position: relative;
pointer-events: auto;
overflow: hidden;
margin: 0 0 6px;
padding: 15px 15px 15px 50px;
width: 300px;
-moz-border-radius: 3px 3px 3px 3px;
-webkit-border-radius: 3px 3px 3px 3px;
border-radius: 3px 3px 3px 3px;
background-position: 15px center;
background-repeat: no-repeat;
-moz-box-shadow: 0 0 12px #999999;
-webkit-box-shadow: 0 0 12px #999999;
box-shadow: 0 0 12px #999999;
color: #ffffff;
opacity: 0.8;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
filter: alpha(opacity=80);
}
> :hover {
-moz-box-shadow: 0 0 12px #000000;
-webkit-box-shadow: 0 0 12px #000000;
box-shadow: 0 0 12px #000000;
opacity: 1;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
filter: alpha(opacity=100);
cursor: pointer;
}
> .toast-info {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important;
}
> .toast-error {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;
}
> .toast-success {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;
}
> .toast-warning {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;
}
&.toast-top-center {
top: 0;
right: 0;
width: 100%;
}
&.toast-bottom-center {
bottom: 0;
right: 0;
width: 100%;
}
&.toast-top-full-width {
top: 0;
right: 0;
width: 100%;
}
&.toast-bottom-full-width {
bottom: 0;
right: 0;
width: 100%;
}
&.toast-top-left {
top: 12px;
left: 12px;
}
&.toast-top-right {
top: 12px;
right: 12px;
}
&.toast-bottom-right {
right: 12px;
bottom: 12px;
}
&.toast-bottom-left {
bottom: 12px;
left: 12px;
}
&.toast-top-center > div,
&.toast-bottom-center > div {
width: 300px;
margin-left: auto;
margin-right: auto;
}
&.toast-top-full-width > div,
&.toast-bottom-full-width > div {
width: 96%;
margin-left: auto;
margin-right: auto;
}
}
.toast {
background-color: #030303;
}
.toast-success {
background-color: #51a351;
}
.toast-error {
background-color: #bd362f;
}
.toast-info {
background-color: #2f96b4;
}
.toast-warning {
background-color: #f89406;
}
.toast-progress {
position: absolute;
left: 0;
bottom: 0;
height: 4px;
background-color: #000000;
opacity: 0.4;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);
filter: alpha(opacity=40);
}
/*Responsive Design*/
@media all and (max-width: 240px) {
#toast-container > div {
padding: 8px 8px 8px 50px;
width: 11em;
}
#toast-container .toast-close-button {
right: -0.2em;
top: -0.2em;
}
}
@media all and (min-width: 241px) and (max-width: 480px) {
#toast-container > div {
padding: 8px 8px 8px 50px;
width: 18em;
}
#toast-container .toast-close-button {
right: -0.2em;
top: -0.2em;
}
}
@media all and (min-width: 481px) and (max-width: 768px) {
#toast-container > div {
padding: 15px 15px 15px 50px;
width: 25em;
}
}

20
_src/mobile/scss/plugins/fontawesome5/_animated.scss

@ -1,20 +0,0 @@
// Animated Icons
// --------------------------
.#{$fa-css-prefix}-spin {
animation: fa-spin 2s infinite linear;
}
.#{$fa-css-prefix}-pulse {
animation: fa-spin 1s infinite steps(8);
}
@keyframes fa-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}

20
_src/mobile/scss/plugins/fontawesome5/_bordered-pulled.scss

@ -1,20 +0,0 @@
// Bordered & Pulled
// -------------------------
.#{$fa-css-prefix}-border {
border: solid .08em $fa-border-color;
border-radius: .1em;
padding: .2em .25em .15em;
}
.#{$fa-css-prefix}-pull-left { float: left; }
.#{$fa-css-prefix}-pull-right { float: right; }
.#{$fa-css-prefix},
.fas,
.far,
.fal,
.fab {
&.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
&.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
}

20
_src/mobile/scss/plugins/fontawesome5/_core.scss

@ -1,20 +0,0 @@
// Base Class Definition
// -------------------------
.#{$fa-css-prefix},
.fas,
.far,
.fal,
.fab {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: inline-block;
font-style: normal;
font-variant: normal;
text-rendering: auto;
line-height: 1;
}
%fa-icon {
@include fa-icon;
}

6
_src/mobile/scss/plugins/fontawesome5/_fixed-width.scss

@ -1,6 +0,0 @@
// Fixed Width Icons
// -------------------------
.#{$fa-css-prefix}-fw {
text-align: center;
width: $fa-fw-width;
}

1786
_src/mobile/scss/plugins/fontawesome5/_icons.scss
File diff suppressed because it is too large
View File

23
_src/mobile/scss/plugins/fontawesome5/_larger.scss

@ -1,23 +0,0 @@
// Icon Sizes
// -------------------------
// makes the font 33% larger relative to the icon container
.#{$fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -.0667em;
}
.#{$fa-css-prefix}-xs {
font-size: .75em;
}
.#{$fa-css-prefix}-sm {
font-size: .875em;
}
@for $i from 1 through 10 {
.#{$fa-css-prefix}-#{$i}x {
font-size: $i * 1em;
}
}

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

Loading…
Cancel
Save