feat: Phase 2.5 - Variant Collections Spreadsheet Editor
Replaces JSON textarea with professional Excel-like spreadsheet interface for managing product variant properties. Features: - Handsontable 14.6.1 spreadsheet component - Property presets (Size, Color, Material, Storage, Custom) - Inline cell editing with Tab/Enter navigation - Context menu for add/remove rows and columns - Keyboard shortcuts (Ctrl+D delete, Ctrl+Enter save, Ctrl+Z undo) - Mobile touch gestures (swipe to delete rows) - Automatic JSON serialization on form submit - Form validation before saving - Comprehensive user guide documentation Files Changed: - LittleShop/package.json: NPM package management setup - LittleShop/wwwroot/js/variant-editor.js: 400-line spreadsheet editor module - LittleShop/wwwroot/lib/handsontable/: Handsontable library (Community Edition) - LittleShop/wwwroot/lib/hammerjs/: Hammer.js touch gesture library - LittleShop/Areas/Admin/Views/VariantCollections/Edit.cshtml: Spreadsheet UI integration - VARIANT_COLLECTIONS_USER_GUIDE.md: Complete user guide (18+ pages) Technical Details: - Excel-like editing experience (no more manual JSON editing) - Mobile-first responsive design - Browser compatibility: Chrome 90+, Firefox 88+, Edge 90+, Safari 14+ - Touch-optimized for mobile administration - Automatic data validation and error handling
This commit is contained in:
67
LittleShop/wwwroot/lib/hammerjs/src/expose.js
Normal file
67
LittleShop/wwwroot/lib/hammerjs/src/expose.js
Normal file
@@ -0,0 +1,67 @@
|
||||
assign(Hammer, {
|
||||
INPUT_START: INPUT_START,
|
||||
INPUT_MOVE: INPUT_MOVE,
|
||||
INPUT_END: INPUT_END,
|
||||
INPUT_CANCEL: INPUT_CANCEL,
|
||||
|
||||
STATE_POSSIBLE: STATE_POSSIBLE,
|
||||
STATE_BEGAN: STATE_BEGAN,
|
||||
STATE_CHANGED: STATE_CHANGED,
|
||||
STATE_ENDED: STATE_ENDED,
|
||||
STATE_RECOGNIZED: STATE_RECOGNIZED,
|
||||
STATE_CANCELLED: STATE_CANCELLED,
|
||||
STATE_FAILED: STATE_FAILED,
|
||||
|
||||
DIRECTION_NONE: DIRECTION_NONE,
|
||||
DIRECTION_LEFT: DIRECTION_LEFT,
|
||||
DIRECTION_RIGHT: DIRECTION_RIGHT,
|
||||
DIRECTION_UP: DIRECTION_UP,
|
||||
DIRECTION_DOWN: DIRECTION_DOWN,
|
||||
DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,
|
||||
DIRECTION_VERTICAL: DIRECTION_VERTICAL,
|
||||
DIRECTION_ALL: DIRECTION_ALL,
|
||||
|
||||
Manager: Manager,
|
||||
Input: Input,
|
||||
TouchAction: TouchAction,
|
||||
|
||||
TouchInput: TouchInput,
|
||||
MouseInput: MouseInput,
|
||||
PointerEventInput: PointerEventInput,
|
||||
TouchMouseInput: TouchMouseInput,
|
||||
SingleTouchInput: SingleTouchInput,
|
||||
|
||||
Recognizer: Recognizer,
|
||||
AttrRecognizer: AttrRecognizer,
|
||||
Tap: TapRecognizer,
|
||||
Pan: PanRecognizer,
|
||||
Swipe: SwipeRecognizer,
|
||||
Pinch: PinchRecognizer,
|
||||
Rotate: RotateRecognizer,
|
||||
Press: PressRecognizer,
|
||||
|
||||
on: addEventListeners,
|
||||
off: removeEventListeners,
|
||||
each: each,
|
||||
merge: merge,
|
||||
extend: extend,
|
||||
assign: assign,
|
||||
inherit: inherit,
|
||||
bindFn: bindFn,
|
||||
prefixed: prefixed
|
||||
});
|
||||
|
||||
// this prevents errors when Hammer is loaded in the presence of an AMD
|
||||
// style loader but by script tag, not by the loader.
|
||||
var freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line
|
||||
freeGlobal.Hammer = Hammer;
|
||||
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(function() {
|
||||
return Hammer;
|
||||
});
|
||||
} else if (typeof module != 'undefined' && module.exports) {
|
||||
module.exports = Hammer;
|
||||
} else {
|
||||
window[exportName] = Hammer;
|
||||
}
|
||||
Reference in New Issue
Block a user