docs-combiner 0.1.17 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +181 -6
- package/dist/preload.js +2 -0
- package/dist/renderer.js +1932 -556
- package/dist/renderer.js.map +1 -1
- package/package.json +1 -1
package/dist/renderer.js
CHANGED
|
@@ -2803,6 +2803,29 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2803
2803
|
|
|
2804
2804
|
/***/ }),
|
|
2805
2805
|
|
|
2806
|
+
/***/ "./node_modules/@mui/icons-material/esm/Backup.js":
|
|
2807
|
+
/*!********************************************************!*\
|
|
2808
|
+
!*** ./node_modules/@mui/icons-material/esm/Backup.js ***!
|
|
2809
|
+
\********************************************************/
|
|
2810
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
2811
|
+
|
|
2812
|
+
"use strict";
|
|
2813
|
+
__webpack_require__.r(__webpack_exports__);
|
|
2814
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
2815
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
2816
|
+
/* harmony export */ });
|
|
2817
|
+
/* harmony import */ var _utils_createSvgIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/createSvgIcon.js */ "./node_modules/@mui/material/esm/utils/createSvgIcon.js");
|
|
2818
|
+
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
|
|
2819
|
+
"use client";
|
|
2820
|
+
|
|
2821
|
+
|
|
2822
|
+
|
|
2823
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_createSvgIcon_js__WEBPACK_IMPORTED_MODULE_0__["default"])(/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)("path", {
|
|
2824
|
+
d: "M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96M14 13v4h-4v-4H7l5-5 5 5z"
|
|
2825
|
+
}), 'Backup'));
|
|
2826
|
+
|
|
2827
|
+
/***/ }),
|
|
2828
|
+
|
|
2806
2829
|
/***/ "./node_modules/@mui/icons-material/esm/Brightness4.js":
|
|
2807
2830
|
/*!*************************************************************!*\
|
|
2808
2831
|
!*** ./node_modules/@mui/icons-material/esm/Brightness4.js ***!
|
|
@@ -12363,6 +12386,162 @@ const formControlLabelClasses = (0,_mui_utils_generateUtilityClasses__WEBPACK_IM
|
|
|
12363
12386
|
|
|
12364
12387
|
/***/ }),
|
|
12365
12388
|
|
|
12389
|
+
/***/ "./node_modules/@mui/material/esm/FormGroup/FormGroup.js":
|
|
12390
|
+
/*!***************************************************************!*\
|
|
12391
|
+
!*** ./node_modules/@mui/material/esm/FormGroup/FormGroup.js ***!
|
|
12392
|
+
\***************************************************************/
|
|
12393
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
12394
|
+
|
|
12395
|
+
"use strict";
|
|
12396
|
+
__webpack_require__.r(__webpack_exports__);
|
|
12397
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
12398
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
12399
|
+
/* harmony export */ });
|
|
12400
|
+
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
|
12401
|
+
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
|
|
12402
|
+
/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.mjs");
|
|
12403
|
+
/* harmony import */ var _mui_utils_composeClasses__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/utils/composeClasses */ "./node_modules/@mui/utils/esm/composeClasses/composeClasses.js");
|
|
12404
|
+
/* harmony import */ var _zero_styled_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../zero-styled/index.js */ "./node_modules/@mui/material/esm/styles/styled.js");
|
|
12405
|
+
/* harmony import */ var _DefaultPropsProvider_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../DefaultPropsProvider/index.js */ "./node_modules/@mui/material/esm/DefaultPropsProvider/DefaultPropsProvider.js");
|
|
12406
|
+
/* harmony import */ var _formGroupClasses_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./formGroupClasses.js */ "./node_modules/@mui/material/esm/FormGroup/formGroupClasses.js");
|
|
12407
|
+
/* harmony import */ var _FormControl_useFormControl_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/useFormControl.js */ "./node_modules/@mui/material/esm/FormControl/useFormControl.js");
|
|
12408
|
+
/* harmony import */ var _FormControl_formControlState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../FormControl/formControlState.js */ "./node_modules/@mui/material/esm/FormControl/formControlState.js");
|
|
12409
|
+
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
|
|
12410
|
+
'use client';
|
|
12411
|
+
|
|
12412
|
+
|
|
12413
|
+
|
|
12414
|
+
|
|
12415
|
+
|
|
12416
|
+
|
|
12417
|
+
|
|
12418
|
+
|
|
12419
|
+
|
|
12420
|
+
|
|
12421
|
+
|
|
12422
|
+
const useUtilityClasses = ownerState => {
|
|
12423
|
+
const {
|
|
12424
|
+
classes,
|
|
12425
|
+
row,
|
|
12426
|
+
error
|
|
12427
|
+
} = ownerState;
|
|
12428
|
+
const slots = {
|
|
12429
|
+
root: ['root', row && 'row', error && 'error']
|
|
12430
|
+
};
|
|
12431
|
+
return (0,_mui_utils_composeClasses__WEBPACK_IMPORTED_MODULE_3__["default"])(slots, _formGroupClasses_js__WEBPACK_IMPORTED_MODULE_6__.getFormGroupUtilityClass, classes);
|
|
12432
|
+
};
|
|
12433
|
+
const FormGroupRoot = (0,_zero_styled_index_js__WEBPACK_IMPORTED_MODULE_4__["default"])('div', {
|
|
12434
|
+
name: 'MuiFormGroup',
|
|
12435
|
+
slot: 'Root',
|
|
12436
|
+
overridesResolver: (props, styles) => {
|
|
12437
|
+
const {
|
|
12438
|
+
ownerState
|
|
12439
|
+
} = props;
|
|
12440
|
+
return [styles.root, ownerState.row && styles.row];
|
|
12441
|
+
}
|
|
12442
|
+
})({
|
|
12443
|
+
display: 'flex',
|
|
12444
|
+
flexDirection: 'column',
|
|
12445
|
+
flexWrap: 'wrap',
|
|
12446
|
+
variants: [{
|
|
12447
|
+
props: {
|
|
12448
|
+
row: true
|
|
12449
|
+
},
|
|
12450
|
+
style: {
|
|
12451
|
+
flexDirection: 'row'
|
|
12452
|
+
}
|
|
12453
|
+
}]
|
|
12454
|
+
});
|
|
12455
|
+
|
|
12456
|
+
/**
|
|
12457
|
+
* `FormGroup` wraps controls such as `Checkbox` and `Switch`.
|
|
12458
|
+
* It provides compact row layout.
|
|
12459
|
+
* For the `Radio`, you should be using the `RadioGroup` component instead of this one.
|
|
12460
|
+
*/
|
|
12461
|
+
const FormGroup = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(function FormGroup(inProps, ref) {
|
|
12462
|
+
const props = (0,_DefaultPropsProvider_index_js__WEBPACK_IMPORTED_MODULE_5__.useDefaultProps)({
|
|
12463
|
+
props: inProps,
|
|
12464
|
+
name: 'MuiFormGroup'
|
|
12465
|
+
});
|
|
12466
|
+
const {
|
|
12467
|
+
className,
|
|
12468
|
+
row = false,
|
|
12469
|
+
...other
|
|
12470
|
+
} = props;
|
|
12471
|
+
const muiFormControl = (0,_FormControl_useFormControl_js__WEBPACK_IMPORTED_MODULE_7__["default"])();
|
|
12472
|
+
const fcs = (0,_FormControl_formControlState_js__WEBPACK_IMPORTED_MODULE_8__["default"])({
|
|
12473
|
+
props,
|
|
12474
|
+
muiFormControl,
|
|
12475
|
+
states: ['error']
|
|
12476
|
+
});
|
|
12477
|
+
const ownerState = {
|
|
12478
|
+
...props,
|
|
12479
|
+
row,
|
|
12480
|
+
error: fcs.error
|
|
12481
|
+
};
|
|
12482
|
+
const classes = useUtilityClasses(ownerState);
|
|
12483
|
+
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(FormGroupRoot, {
|
|
12484
|
+
className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(classes.root, className),
|
|
12485
|
+
ownerState: ownerState,
|
|
12486
|
+
ref: ref,
|
|
12487
|
+
...other
|
|
12488
|
+
});
|
|
12489
|
+
});
|
|
12490
|
+
true ? FormGroup.propTypes /* remove-proptypes */ = {
|
|
12491
|
+
// ┌────────────────────────────── Warning ──────────────────────────────┐
|
|
12492
|
+
// │ These PropTypes are generated from the TypeScript type definitions. │
|
|
12493
|
+
// │ To update them, edit the d.ts file and run `pnpm proptypes`. │
|
|
12494
|
+
// └─────────────────────────────────────────────────────────────────────┘
|
|
12495
|
+
/**
|
|
12496
|
+
* The content of the component.
|
|
12497
|
+
*/
|
|
12498
|
+
children: prop_types__WEBPACK_IMPORTED_MODULE_1__.node,
|
|
12499
|
+
/**
|
|
12500
|
+
* Override or extend the styles applied to the component.
|
|
12501
|
+
*/
|
|
12502
|
+
classes: prop_types__WEBPACK_IMPORTED_MODULE_1__.object,
|
|
12503
|
+
/**
|
|
12504
|
+
* @ignore
|
|
12505
|
+
*/
|
|
12506
|
+
className: prop_types__WEBPACK_IMPORTED_MODULE_1__.string,
|
|
12507
|
+
/**
|
|
12508
|
+
* Display group of elements in a compact row.
|
|
12509
|
+
* @default false
|
|
12510
|
+
*/
|
|
12511
|
+
row: prop_types__WEBPACK_IMPORTED_MODULE_1__.bool,
|
|
12512
|
+
/**
|
|
12513
|
+
* The system prop that allows defining system overrides as well as additional CSS styles.
|
|
12514
|
+
*/
|
|
12515
|
+
sx: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1__.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1__.func, prop_types__WEBPACK_IMPORTED_MODULE_1__.object, prop_types__WEBPACK_IMPORTED_MODULE_1__.bool])), prop_types__WEBPACK_IMPORTED_MODULE_1__.func, prop_types__WEBPACK_IMPORTED_MODULE_1__.object])
|
|
12516
|
+
} : 0;
|
|
12517
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FormGroup);
|
|
12518
|
+
|
|
12519
|
+
/***/ }),
|
|
12520
|
+
|
|
12521
|
+
/***/ "./node_modules/@mui/material/esm/FormGroup/formGroupClasses.js":
|
|
12522
|
+
/*!**********************************************************************!*\
|
|
12523
|
+
!*** ./node_modules/@mui/material/esm/FormGroup/formGroupClasses.js ***!
|
|
12524
|
+
\**********************************************************************/
|
|
12525
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
12526
|
+
|
|
12527
|
+
"use strict";
|
|
12528
|
+
__webpack_require__.r(__webpack_exports__);
|
|
12529
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
12530
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
|
|
12531
|
+
/* harmony export */ getFormGroupUtilityClass: () => (/* binding */ getFormGroupUtilityClass)
|
|
12532
|
+
/* harmony export */ });
|
|
12533
|
+
/* harmony import */ var _mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @mui/utils/generateUtilityClasses */ "./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js");
|
|
12534
|
+
/* harmony import */ var _mui_utils_generateUtilityClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils/generateUtilityClass */ "./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js");
|
|
12535
|
+
|
|
12536
|
+
|
|
12537
|
+
function getFormGroupUtilityClass(slot) {
|
|
12538
|
+
return (0,_mui_utils_generateUtilityClass__WEBPACK_IMPORTED_MODULE_1__["default"])('MuiFormGroup', slot);
|
|
12539
|
+
}
|
|
12540
|
+
const formGroupClasses = (0,_mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MODULE_0__["default"])('MuiFormGroup', ['root', 'row', 'error']);
|
|
12541
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (formGroupClasses);
|
|
12542
|
+
|
|
12543
|
+
/***/ }),
|
|
12544
|
+
|
|
12366
12545
|
/***/ "./node_modules/@mui/material/esm/FormHelperText/FormHelperText.js":
|
|
12367
12546
|
/*!*************************************************************************!*\
|
|
12368
12547
|
!*** ./node_modules/@mui/material/esm/FormHelperText/FormHelperText.js ***!
|
|
@@ -100922,21 +101101,21 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
100922
101101
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Box/Box.js");
|
|
100923
101102
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Typography/Typography.js");
|
|
100924
101103
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Container/Container.js");
|
|
100925
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100926
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100927
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100928
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100929
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100930
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100931
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100932
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100933
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100934
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100935
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100936
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100937
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
101104
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tooltip/Tooltip.js");
|
|
101105
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/IconButton/IconButton.js");
|
|
101106
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Card/Card.js");
|
|
101107
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/CardContent/CardContent.js");
|
|
101108
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Stack/Stack.js");
|
|
101109
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Accordion/Accordion.js");
|
|
101110
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionSummary/AccordionSummary.js");
|
|
101111
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionDetails/AccordionDetails.js");
|
|
101112
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/TextField/TextField.js");
|
|
101113
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormHelperText/FormHelperText.js");
|
|
101114
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/CircularProgress/CircularProgress.js");
|
|
101115
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Alert/Alert.js");
|
|
101116
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Divider/Divider.js");
|
|
100938
101117
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/InputAdornment/InputAdornment.js");
|
|
100939
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
101118
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Button/Button.js");
|
|
100940
101119
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormControlLabel/FormControlLabel.js");
|
|
100941
101120
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Checkbox/Checkbox.js");
|
|
100942
101121
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormControl/FormControl.js");
|
|
@@ -100946,37 +101125,43 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
100946
101125
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/ToggleButtonGroup/ToggleButtonGroup.js");
|
|
100947
101126
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/ToggleButton/ToggleButton.js");
|
|
100948
101127
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Dialog/Dialog.js");
|
|
100949
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100950
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100951
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100952
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100953
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100954
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
100955
|
-
/* harmony import */ var
|
|
100956
|
-
/* harmony import */ var
|
|
100957
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100958
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100959
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100960
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100961
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100962
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100963
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100964
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100965
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100966
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100967
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100968
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100969
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100970
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100971
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100972
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100973
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100974
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
100975
|
-
/* harmony import */ var
|
|
100976
|
-
/* harmony import */ var
|
|
100977
|
-
/* harmony import */ var
|
|
100978
|
-
/* harmony import */ var
|
|
100979
|
-
/* harmony import */ var
|
|
101128
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogTitle/DialogTitle.js");
|
|
101129
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogContent/DialogContent.js");
|
|
101130
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogActions/DialogActions.js");
|
|
101131
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Paper/Paper.js");
|
|
101132
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormGroup/FormGroup.js");
|
|
101133
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Snackbar/Snackbar.js");
|
|
101134
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/styles/createTheme.js");
|
|
101135
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/styles/ThemeProvider.js");
|
|
101136
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AccountBalance.js");
|
|
101137
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AttachMoney.js");
|
|
101138
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AutoAwesome.js");
|
|
101139
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Backup.js");
|
|
101140
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Brightness4.js");
|
|
101141
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Brightness7.js");
|
|
101142
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CheckCircle.js");
|
|
101143
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Close.js");
|
|
101144
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CloudDownload.js");
|
|
101145
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ContentCopy.js");
|
|
101146
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ContentPaste.js");
|
|
101147
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/DeleteOutline.js");
|
|
101148
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ExpandMore.js");
|
|
101149
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Fullscreen.js");
|
|
101150
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Login.js");
|
|
101151
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Logout.js");
|
|
101152
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/NoteAdd.js");
|
|
101153
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/OpenInNew.js");
|
|
101154
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Replay.js");
|
|
101155
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Settings.js");
|
|
101156
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Visibility.js");
|
|
101157
|
+
/* harmony import */ var _PromptManagerDialog__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./PromptManagerDialog */ "./src/PromptManagerDialog.tsx");
|
|
101158
|
+
/* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
|
|
101159
|
+
/* harmony import */ var _appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./appSettingsBundle */ "./src/appSettingsBundle.ts");
|
|
101160
|
+
/* harmony import */ var _flexcardBalance__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./flexcardBalance */ "./src/flexcardBalance.ts");
|
|
101161
|
+
/* harmony import */ var xlsx__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! xlsx */ "./node_modules/xlsx/xlsx.mjs");
|
|
101162
|
+
/* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! jszip */ "./node_modules/jszip/dist/jszip.min.js");
|
|
101163
|
+
/* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_67___default = /*#__PURE__*/__webpack_require__.n(jszip__WEBPACK_IMPORTED_MODULE_67__);
|
|
101164
|
+
|
|
100980
101165
|
|
|
100981
101166
|
|
|
100982
101167
|
|
|
@@ -101130,19 +101315,51 @@ function extractChatCompletionText(choice) {
|
|
|
101130
101315
|
if (!msg)
|
|
101131
101316
|
return '';
|
|
101132
101317
|
const c = msg.content;
|
|
101133
|
-
|
|
101134
|
-
|
|
101135
|
-
|
|
101136
|
-
|
|
101318
|
+
let fromContent = '';
|
|
101319
|
+
if (typeof c === 'string') {
|
|
101320
|
+
fromContent = c;
|
|
101321
|
+
}
|
|
101322
|
+
else if (Array.isArray(c)) {
|
|
101323
|
+
fromContent = c
|
|
101137
101324
|
.map((part) => (typeof part === 'string' ? part : part?.text ?? part?.content ?? ''))
|
|
101138
101325
|
.filter(Boolean)
|
|
101139
101326
|
.join('');
|
|
101140
101327
|
}
|
|
101141
|
-
if (c != null && typeof c === 'object' && typeof c.text === 'string') {
|
|
101142
|
-
|
|
101328
|
+
else if (c != null && typeof c === 'object' && typeof c.text === 'string') {
|
|
101329
|
+
fromContent = c.text;
|
|
101330
|
+
}
|
|
101331
|
+
if (fromContent.trim())
|
|
101332
|
+
return fromContent;
|
|
101333
|
+
// Часть моделей (reasoning) кладёт текст в reasoning/refusal — иначе «Полный ответ» пустой.
|
|
101334
|
+
const reasoning = msg.reasoning;
|
|
101335
|
+
if (typeof reasoning === 'string' && reasoning.trim())
|
|
101336
|
+
return reasoning;
|
|
101337
|
+
if (Array.isArray(reasoning)) {
|
|
101338
|
+
const r = reasoning
|
|
101339
|
+
.map((p) => (typeof p === 'string' ? p : p?.text ?? ''))
|
|
101340
|
+
.filter(Boolean)
|
|
101341
|
+
.join('\n');
|
|
101342
|
+
if (r.trim())
|
|
101343
|
+
return r;
|
|
101143
101344
|
}
|
|
101345
|
+
const refusal = msg.refusal;
|
|
101346
|
+
if (typeof refusal === 'string' && refusal.trim())
|
|
101347
|
+
return refusal;
|
|
101144
101348
|
return '';
|
|
101145
101349
|
}
|
|
101350
|
+
/** Сырой JSON, если в message не извлекли ни одной буквы — иначе «Полный ответ» = пусто и UI показывает лишь подсказку из checkErrors. */
|
|
101351
|
+
const VALIDATOR_RESULT_RAW_JSON_MAX = 48_000;
|
|
101352
|
+
function buildValidatorStoredResultText(content, data) {
|
|
101353
|
+
if (content.trim().length > 0) {
|
|
101354
|
+
return content;
|
|
101355
|
+
}
|
|
101356
|
+
const raw = JSON.stringify(data ?? {}, null, 2);
|
|
101357
|
+
const pre = 'Текст ответа модели не извлечён из message.content (проверьте reasoning/формат в JSON ниже). Ответ API:\n\n';
|
|
101358
|
+
if (raw.length <= VALIDATOR_RESULT_RAW_JSON_MAX) {
|
|
101359
|
+
return pre + raw;
|
|
101360
|
+
}
|
|
101361
|
+
return `${pre}${raw.slice(0, VALIDATOR_RESULT_RAW_JSON_MAX)}…\n[обрезано по ${VALIDATOR_RESULT_RAW_JSON_MAX} симв.]`;
|
|
101362
|
+
}
|
|
101146
101363
|
/** Обрыв ответа по лимиту токенов (OpenRouter / OpenAI-совместимый completion). */
|
|
101147
101364
|
function isCompletionTruncatedByTokenLimit(choice) {
|
|
101148
101365
|
if (!choice)
|
|
@@ -101243,7 +101460,8 @@ function isValidationNegationLine(s) {
|
|
|
101243
101460
|
const t = normalizeValidationErrorText(s).toLowerCase();
|
|
101244
101461
|
if (!t)
|
|
101245
101462
|
return true;
|
|
101246
|
-
|
|
101463
|
+
const tBare = t.replace(/\.+$/g, '').trim();
|
|
101464
|
+
if (tBare === 'нет')
|
|
101247
101465
|
return true;
|
|
101248
101466
|
if (t.includes('нет ошибок') || t.includes('ошибок нет'))
|
|
101249
101467
|
return true;
|
|
@@ -101330,6 +101548,17 @@ function extractLeadingPriceNumber(value) {
|
|
|
101330
101548
|
return m[1].replace(',', '.');
|
|
101331
101549
|
return '99';
|
|
101332
101550
|
}
|
|
101551
|
+
/** Крео подходит под «Загрузить правильные» — как зелёная подпись «Проверка пройдена»: статус ok и реальная проверка (не «отключена»). Список checkErrors при ok не используем: парсер иногда оставляет ложные строки вроде «нет.». */
|
|
101552
|
+
function isCreoPassedValidatorForDriveUpload(img) {
|
|
101553
|
+
return img.checkStatus === 'ok' && img.checkResult !== 'Проверка отключена';
|
|
101554
|
+
}
|
|
101555
|
+
/** Автозагрузка на Drive только после реального OK валидатора (не при отключённой проверке). */
|
|
101556
|
+
function shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, validationResult) {
|
|
101557
|
+
return (uploadAfterValidatorOk &&
|
|
101558
|
+
!validationDisabled &&
|
|
101559
|
+
validationResult.status === 'ok' &&
|
|
101560
|
+
validationResult.result !== 'Проверка отключена');
|
|
101561
|
+
}
|
|
101333
101562
|
/** Фон карточки крео: после 1-й переделки — светло-жёлтый, далее темнеет с каждой следующей. */
|
|
101334
101563
|
function getRemakeHighlightBackground(remakeCount, dark) {
|
|
101335
101564
|
if (remakeCount <= 0)
|
|
@@ -101433,6 +101662,13 @@ function App() {
|
|
|
101433
101662
|
const [openRouterAccountBalance, setOpenRouterAccountBalance] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
|
|
101434
101663
|
const [openRouterBalanceLoading, setOpenRouterBalanceLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
101435
101664
|
const fetchBalanceRef = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null);
|
|
101665
|
+
const [flexcardApiKey, setFlexcardApiKey] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
|
|
101666
|
+
/** Сумма USD по всем строкам `GET /api/v1/finance/accounts/`; null — ошибка / нет данных */
|
|
101667
|
+
const [flexCardUsdTotal, setFlexCardUsdTotal] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
|
|
101668
|
+
const [flexCardBalanceLoading, setFlexCardBalanceLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
101669
|
+
const [telegramBotToken, setTelegramBotToken] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
|
|
101670
|
+
const [telegramChatId, setTelegramChatId] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
|
|
101671
|
+
const [telegramTestSending, setTelegramTestSending] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
101436
101672
|
const [generateProduct, setGenerateProduct] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
|
|
101437
101673
|
const [generateGeo, setGenerateGeo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
|
|
101438
101674
|
const [generateAdditionalInfo, setGenerateAdditionalInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
|
|
@@ -101495,6 +101731,14 @@ function App() {
|
|
|
101495
101731
|
return false;
|
|
101496
101732
|
}
|
|
101497
101733
|
});
|
|
101734
|
+
const [uploadAfterValidatorOk, setUploadAfterValidatorOk] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => {
|
|
101735
|
+
try {
|
|
101736
|
+
return localStorage.getItem('uploadAfterValidatorOk') === 'true';
|
|
101737
|
+
}
|
|
101738
|
+
catch {
|
|
101739
|
+
return false;
|
|
101740
|
+
}
|
|
101741
|
+
});
|
|
101498
101742
|
const [imageAspectRatio, setImageAspectRatio] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => {
|
|
101499
101743
|
const saved = localStorage.getItem('imageAspectRatio');
|
|
101500
101744
|
// Migrate legacy values (4:5, 9:16) to 2:3
|
|
@@ -101554,6 +101798,7 @@ function App() {
|
|
|
101554
101798
|
'rub': 'RUB',
|
|
101555
101799
|
'forint': 'HUF',
|
|
101556
101800
|
'forints': 'HUF',
|
|
101801
|
+
'ft': 'HUF', // Hungarian forint (e.g. "11 400 Ft")
|
|
101557
101802
|
'huf': 'HUF',
|
|
101558
101803
|
'zloty': 'PLN',
|
|
101559
101804
|
'zlotys': 'PLN',
|
|
@@ -101568,6 +101813,7 @@ function App() {
|
|
|
101568
101813
|
'krone': 'DKK',
|
|
101569
101814
|
'kroner': 'DKK',
|
|
101570
101815
|
'dkk': 'DKK',
|
|
101816
|
+
'kč': 'CZK',
|
|
101571
101817
|
'koruna': 'CZK',
|
|
101572
101818
|
'koruny': 'CZK',
|
|
101573
101819
|
'czk': 'CZK',
|
|
@@ -101693,12 +101939,22 @@ function App() {
|
|
|
101693
101939
|
const [generatingImages, setGeneratingImages] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
101694
101940
|
const [imagesGenerationLogs, setImagesGenerationLogs] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
|
|
101695
101941
|
const [generatedImagesData, setGeneratedImagesData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
|
|
101942
|
+
const { pendingDriveUploadCreos, pendingValidatorOkDriveUploadCreos } = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {
|
|
101943
|
+
const pending = generatedImagesData.filter(img => !img.uploaded && img.imageUrl);
|
|
101944
|
+
return {
|
|
101945
|
+
pendingDriveUploadCreos: pending,
|
|
101946
|
+
pendingValidatorOkDriveUploadCreos: pending.filter(isCreoPassedValidatorForDriveUpload)
|
|
101947
|
+
};
|
|
101948
|
+
}, [generatedImagesData]);
|
|
101949
|
+
const creoAutoUploadAfterValidatorOkRef = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(async () => { });
|
|
101696
101950
|
const [checkingImages, setCheckingImages] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
101697
101951
|
const [uploadingImages, setUploadingImages] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
101698
101952
|
/** Индекс крео, для которого идёт удаление файла с Drive (кнопка «Удалить с Диска»). */
|
|
101699
101953
|
const [deletingDriveImageIndex, setDeletingDriveImageIndex] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
|
|
101700
101954
|
/** Полноэкранный просмотр сгенерированного крео (url + подпись). */
|
|
101701
101955
|
const [creoFullscreen, setCreoFullscreen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
|
|
101956
|
+
/** Полный текст ответа валидатора (или сообщение при сбое канала) — для отладки из карточки крео */
|
|
101957
|
+
const [validatorDebugDialog, setValidatorDebugDialog] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
|
|
101702
101958
|
const [uploadingProduct, setUploadingProduct] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
101703
101959
|
const [folderFilesInfo, setFolderFilesInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
|
|
101704
101960
|
const [rootFolderInfo, setRootFolderInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
|
|
@@ -101749,6 +102005,9 @@ function App() {
|
|
|
101749
102005
|
const [openRouterKeyCopied, setOpenRouterKeyCopied] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
101750
102006
|
const [loadingContentFromDrive, setLoadingContentFromDrive] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
101751
102007
|
const [driveFilesFound, setDriveFilesFound] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ content: false });
|
|
102008
|
+
/** Креатив/новая папка без project-settings: пользователь нажал «это нормально» — больше не спрашивать для этой папки в сессии. */
|
|
102009
|
+
const dismissedSettingsMissingForFolderRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(new Set());
|
|
102010
|
+
const [settingsFileMissingDialog, setSettingsFileMissingDialog] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ open: false, folderId: null, retrying: false });
|
|
101752
102011
|
const syncDriveAfterPromptSaveRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(() => { });
|
|
101753
102012
|
// Theme state
|
|
101754
102013
|
const [darkMode, setDarkMode] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => {
|
|
@@ -101824,7 +102083,7 @@ function App() {
|
|
|
101824
102083
|
}
|
|
101825
102084
|
};
|
|
101826
102085
|
// Create theme based on mode
|
|
101827
|
-
const theme = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => (0,
|
|
102086
|
+
const theme = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => (0,_mui_material__WEBPACK_IMPORTED_MODULE_39__["default"])({
|
|
101828
102087
|
palette: {
|
|
101829
102088
|
mode: darkMode ? 'dark' : 'light',
|
|
101830
102089
|
...(darkMode
|
|
@@ -101879,6 +102138,15 @@ function App() {
|
|
|
101879
102138
|
applyThemeStyles(darkMode);
|
|
101880
102139
|
}, [darkMode]);
|
|
101881
102140
|
const [promptManagerOpen, setPromptManagerOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
102141
|
+
/** Резервная копия локальных настроек: что включить в экспорт */
|
|
102142
|
+
const [settingsExportFlags, setSettingsExportFlags] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ ..._appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.DEFAULT_EXPORT_FLAGS });
|
|
102143
|
+
/** Загруженный из файла бандл до подтверждения импорта */
|
|
102144
|
+
const [settingsImportBundle, setSettingsImportBundle] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
|
|
102145
|
+
/** Какие блоки из `settingsImportBundle` применить (чекбоксы) */
|
|
102146
|
+
const [settingsImportFlags, setSettingsImportFlags] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
|
|
102147
|
+
const [settingsBackupSnackbar, setSettingsBackupSnackbar] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ open: false, message: '', severity: 'success' });
|
|
102148
|
+
const [settingsBackupDialogOpen, setSettingsBackupDialogOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
102149
|
+
const settingsImportFileInputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
|
|
101882
102150
|
/** После загрузки project-settings.json: спросить, подставить подходы из файла или оставить локальные. */
|
|
101883
102151
|
const [approachLoadChoice, setApproachLoadChoice] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
|
|
101884
102152
|
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
@@ -101901,6 +102169,13 @@ function App() {
|
|
|
101901
102169
|
setOpenaiApiKey(config.openaiApiKey);
|
|
101902
102170
|
// Balance will be fetched automatically by useEffect when openaiApiKey changes
|
|
101903
102171
|
}
|
|
102172
|
+
if (config.flexcardApiKey) {
|
|
102173
|
+
setFlexcardApiKey(String(config.flexcardApiKey));
|
|
102174
|
+
}
|
|
102175
|
+
if (config.telegramBotToken)
|
|
102176
|
+
setTelegramBotToken(String(config.telegramBotToken));
|
|
102177
|
+
if (config.telegramChatId)
|
|
102178
|
+
setTelegramChatId(String(config.telegramChatId));
|
|
101904
102179
|
if (config.secretUnlockPassed === true) {
|
|
101905
102180
|
setUnlocked(true);
|
|
101906
102181
|
try {
|
|
@@ -101930,7 +102205,7 @@ function App() {
|
|
|
101930
102205
|
};
|
|
101931
102206
|
loadKey();
|
|
101932
102207
|
// Load prompt overrides from Electron config
|
|
101933
|
-
(0,
|
|
102208
|
+
(0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.loadOverridesFromElectron)();
|
|
101934
102209
|
}, []);
|
|
101935
102210
|
// Save form fields to localStorage whenever they change
|
|
101936
102211
|
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
@@ -101966,6 +102241,9 @@ function App() {
|
|
|
101966
102241
|
// Don't save while loading from Drive to avoid loops
|
|
101967
102242
|
if (loadingContentFromDrive)
|
|
101968
102243
|
return;
|
|
102244
|
+
// Пока открыт диалог «настройки не найдены» — не создаём/не перезаписываем project-settings (иначе гонка с «перепроверить»)
|
|
102245
|
+
if (settingsFileMissingDialog.open)
|
|
102246
|
+
return;
|
|
101969
102247
|
const folderId = extractFolderId(driveFolderUrl);
|
|
101970
102248
|
if (!folderId)
|
|
101971
102249
|
return;
|
|
@@ -102003,12 +102281,14 @@ function App() {
|
|
|
102003
102281
|
catalogUrlImageAspectParam,
|
|
102004
102282
|
catalogLinkExtraMacros,
|
|
102005
102283
|
driveFolderUrl,
|
|
102006
|
-
loadingContentFromDrive
|
|
102284
|
+
loadingContentFromDrive,
|
|
102285
|
+
settingsFileMissingDialog.open
|
|
102007
102286
|
]);
|
|
102008
102287
|
// Load generated content from Google Drive when driveFolderUrl changes
|
|
102009
102288
|
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
102010
102289
|
if (!driveFolderUrl) {
|
|
102011
102290
|
logToTerminal('log', '[Load] No driveFolderUrl, skipping load');
|
|
102291
|
+
setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
|
|
102012
102292
|
setLoadingContentFromDrive(false);
|
|
102013
102293
|
setDriveFilesFound({ content: false });
|
|
102014
102294
|
// Clear all data when driveFolderUrl is cleared
|
|
@@ -102028,6 +102308,7 @@ function App() {
|
|
|
102028
102308
|
const folderId = extractFolderId(driveFolderUrl);
|
|
102029
102309
|
if (!folderId) {
|
|
102030
102310
|
logToTerminal('warn', '[Load] Invalid driveFolderUrl, cannot extract folderId:', driveFolderUrl);
|
|
102311
|
+
setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
|
|
102031
102312
|
setLoadingContentFromDrive(false);
|
|
102032
102313
|
setDriveFilesFound({ content: false });
|
|
102033
102314
|
// Clear all data when folderId cannot be extracted
|
|
@@ -102057,13 +102338,20 @@ function App() {
|
|
|
102057
102338
|
setPairTranslations({});
|
|
102058
102339
|
setPairTranslationFailed(false);
|
|
102059
102340
|
setApproachLoadChoice(null);
|
|
102341
|
+
setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
|
|
102060
102342
|
setLoadingContentFromDrive(true);
|
|
102061
102343
|
setDriveFilesFound({ content: false });
|
|
102062
102344
|
// Load content from Google Drive
|
|
102063
|
-
loadGeneratedContentFromDrive(folderId)
|
|
102064
|
-
|
|
102345
|
+
loadGeneratedContentFromDrive(folderId)
|
|
102346
|
+
.then((result) => {
|
|
102347
|
+
logToTerminal('log', '[Load] Content loading completed, found:', result.found, 'noSettingsFile:', Boolean(result.noSettingsFile));
|
|
102065
102348
|
setLoadingContentFromDrive(false);
|
|
102066
|
-
|
|
102349
|
+
if (result.noSettingsFile &&
|
|
102350
|
+
!dismissedSettingsMissingForFolderRef.current.has(folderId)) {
|
|
102351
|
+
setSettingsFileMissingDialog({ open: true, folderId, retrying: false });
|
|
102352
|
+
}
|
|
102353
|
+
})
|
|
102354
|
+
.catch((err) => {
|
|
102067
102355
|
logToTerminal('error', '[Load] Error loading content from Google Drive:', err);
|
|
102068
102356
|
setLoadingContentFromDrive(false);
|
|
102069
102357
|
});
|
|
@@ -102203,6 +102491,25 @@ function App() {
|
|
|
102203
102491
|
return () => clearInterval(intervalId);
|
|
102204
102492
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
102205
102493
|
}, [openaiApiKey]);
|
|
102494
|
+
// FlexCard: баланс при ключе, каждые 10 минут и при открытии диалога резервной копии
|
|
102495
|
+
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
102496
|
+
if (!flexcardApiKey.trim()) {
|
|
102497
|
+
setFlexCardUsdTotal(null);
|
|
102498
|
+
return;
|
|
102499
|
+
}
|
|
102500
|
+
void fetchFlexCardBalance();
|
|
102501
|
+
const intervalId = setInterval(() => {
|
|
102502
|
+
void fetchFlexCardBalance();
|
|
102503
|
+
}, 600000);
|
|
102504
|
+
return () => clearInterval(intervalId);
|
|
102505
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
102506
|
+
}, [flexcardApiKey]);
|
|
102507
|
+
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
102508
|
+
if (!settingsBackupDialogOpen || !flexcardApiKey.trim())
|
|
102509
|
+
return;
|
|
102510
|
+
void fetchFlexCardBalance();
|
|
102511
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
102512
|
+
}, [settingsBackupDialogOpen]);
|
|
102206
102513
|
// Fetch image models when API key changes
|
|
102207
102514
|
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
102208
102515
|
if (!openaiApiKey) {
|
|
@@ -102492,7 +102799,7 @@ function App() {
|
|
|
102492
102799
|
clearTimeout(pollTimeoutId);
|
|
102493
102800
|
};
|
|
102494
102801
|
}, [driveFolderUrl, accessToken, refreshToken]);
|
|
102495
|
-
const saveConfig = async (newClientId, newClientSecret, newAccessToken, newRefreshToken, newOpenaiApiKey) => {
|
|
102802
|
+
const saveConfig = async (newClientId, newClientSecret, newAccessToken, newRefreshToken, newOpenaiApiKey, newFlexcardApiKey, newTelegramBotToken, newTelegramChatId) => {
|
|
102496
102803
|
try {
|
|
102497
102804
|
const api = getElectronAPI();
|
|
102498
102805
|
if (api) {
|
|
@@ -102503,7 +102810,10 @@ function App() {
|
|
|
102503
102810
|
clientSecret: newClientSecret ?? clientSecret,
|
|
102504
102811
|
accessToken: newAccessToken ?? accessToken,
|
|
102505
102812
|
refreshToken: newRefreshToken ?? refreshToken,
|
|
102506
|
-
openaiApiKey: newOpenaiApiKey ?? openaiApiKey
|
|
102813
|
+
openaiApiKey: newOpenaiApiKey ?? openaiApiKey,
|
|
102814
|
+
flexcardApiKey: newFlexcardApiKey ?? flexcardApiKey,
|
|
102815
|
+
telegramBotToken: newTelegramBotToken ?? telegramBotToken,
|
|
102816
|
+
telegramChatId: newTelegramChatId ?? telegramChatId,
|
|
102507
102817
|
});
|
|
102508
102818
|
}
|
|
102509
102819
|
}
|
|
@@ -102736,6 +103046,15 @@ function App() {
|
|
|
102736
103046
|
/* ignore */
|
|
102737
103047
|
}
|
|
102738
103048
|
};
|
|
103049
|
+
const handleUploadAfterValidatorOkChange = (checked) => {
|
|
103050
|
+
setUploadAfterValidatorOk(checked);
|
|
103051
|
+
try {
|
|
103052
|
+
localStorage.setItem('uploadAfterValidatorOk', String(checked));
|
|
103053
|
+
}
|
|
103054
|
+
catch {
|
|
103055
|
+
/* ignore */
|
|
103056
|
+
}
|
|
103057
|
+
};
|
|
102739
103058
|
// Fetch OpenRouter account balance and key limit
|
|
102740
103059
|
const fetchOpenRouterBalance = async (apiKey) => {
|
|
102741
103060
|
const keyToUse = apiKey ?? openaiApiKey;
|
|
@@ -102921,6 +103240,73 @@ function App() {
|
|
|
102921
103240
|
fetchBalanceRef.current = fetchPromise;
|
|
102922
103241
|
await fetchPromise;
|
|
102923
103242
|
};
|
|
103243
|
+
const fetchFlexCardBalance = async (apiKey) => {
|
|
103244
|
+
const keyToUse = (apiKey ?? flexcardApiKey).trim();
|
|
103245
|
+
if (!keyToUse) {
|
|
103246
|
+
setFlexCardUsdTotal(null);
|
|
103247
|
+
return;
|
|
103248
|
+
}
|
|
103249
|
+
setFlexCardBalanceLoading(true);
|
|
103250
|
+
try {
|
|
103251
|
+
const total = await (0,_flexcardBalance__WEBPACK_IMPORTED_MODULE_65__.fetchFlexCardFinanceAccountsUsdTotal)(keyToUse);
|
|
103252
|
+
setFlexCardUsdTotal(total);
|
|
103253
|
+
if (total === null) {
|
|
103254
|
+
logToTerminal('warn', '⚠️ FlexCard: не удалось загрузить finance/accounts (ключ или права API).');
|
|
103255
|
+
}
|
|
103256
|
+
}
|
|
103257
|
+
catch (e) {
|
|
103258
|
+
setFlexCardUsdTotal(null);
|
|
103259
|
+
logToTerminal('error', '❌ FlexCard:', e instanceof Error ? e.message : String(e));
|
|
103260
|
+
}
|
|
103261
|
+
finally {
|
|
103262
|
+
setFlexCardBalanceLoading(false);
|
|
103263
|
+
}
|
|
103264
|
+
};
|
|
103265
|
+
const handleFlexcardApiKeyChange = (val) => {
|
|
103266
|
+
setFlexcardApiKey(val);
|
|
103267
|
+
saveConfig(undefined, undefined, undefined, undefined, undefined, val);
|
|
103268
|
+
if (val.trim()) {
|
|
103269
|
+
void fetchFlexCardBalance(val);
|
|
103270
|
+
}
|
|
103271
|
+
else {
|
|
103272
|
+
setFlexCardUsdTotal(null);
|
|
103273
|
+
}
|
|
103274
|
+
};
|
|
103275
|
+
const handleTelegramBotTokenChange = (val) => {
|
|
103276
|
+
setTelegramBotToken(val);
|
|
103277
|
+
saveConfig(undefined, undefined, undefined, undefined, undefined, undefined, val, undefined);
|
|
103278
|
+
};
|
|
103279
|
+
const handleTelegramChatIdChange = (val) => {
|
|
103280
|
+
setTelegramChatId(val);
|
|
103281
|
+
saveConfig(undefined, undefined, undefined, undefined, undefined, undefined, undefined, val);
|
|
103282
|
+
};
|
|
103283
|
+
const handleTelegramTestSend = async () => {
|
|
103284
|
+
const api = getElectronAPI();
|
|
103285
|
+
if (!api?.telegramSendTest) {
|
|
103286
|
+
alert('Отправка теста доступна в приложении Electron.');
|
|
103287
|
+
return;
|
|
103288
|
+
}
|
|
103289
|
+
const token = telegramBotToken.trim();
|
|
103290
|
+
const chat = telegramChatId.trim();
|
|
103291
|
+
if (!token || !chat) {
|
|
103292
|
+
alert('Укажите токен бота и ID чата.');
|
|
103293
|
+
return;
|
|
103294
|
+
}
|
|
103295
|
+
setTelegramTestSending(true);
|
|
103296
|
+
try {
|
|
103297
|
+
const r = await api.telegramSendTest(token, chat);
|
|
103298
|
+
if (r.ok)
|
|
103299
|
+
alert('Сообщение отправлено.');
|
|
103300
|
+
else
|
|
103301
|
+
alert(r.error || 'Ошибка отправки.');
|
|
103302
|
+
}
|
|
103303
|
+
catch (e) {
|
|
103304
|
+
alert(e instanceof Error ? e.message : String(e));
|
|
103305
|
+
}
|
|
103306
|
+
finally {
|
|
103307
|
+
setTelegramTestSending(false);
|
|
103308
|
+
}
|
|
103309
|
+
};
|
|
102924
103310
|
// Fetch available image generation models from OpenRouter
|
|
102925
103311
|
const fetchImageModels = async (apiKey) => {
|
|
102926
103312
|
const keyToUse = apiKey ?? openaiApiKey;
|
|
@@ -102979,14 +103365,6 @@ function App() {
|
|
|
102979
103365
|
name: model.name || model.id
|
|
102980
103366
|
}))
|
|
102981
103367
|
.sort((a, b) => a.name.localeCompare(b.name));
|
|
102982
|
-
// Debug: log raw structure of a few representative models
|
|
102983
|
-
const debugModels = (data.data || []).filter((m) => m.id?.includes('flux') || m.id?.includes('riverflow') || m.id?.includes('gemini')).slice(0, 6);
|
|
102984
|
-
if (debugModels.length > 0) {
|
|
102985
|
-
logToTerminal('log', '🔬 Image model raw structures (flux/riverflow/gemini sample):');
|
|
102986
|
-
debugModels.forEach((m) => {
|
|
102987
|
-
logToTerminal('log', ` ${m.id} → architecture=${JSON.stringify(m.architecture)}, modalities=${JSON.stringify(m.modalities)}`);
|
|
102988
|
-
});
|
|
102989
|
-
}
|
|
102990
103368
|
logToTerminal('log', `✅ Found ${imageGenModels.length} image generation models`);
|
|
102991
103369
|
setImageModels(imageGenModels);
|
|
102992
103370
|
// Если выбранной модели нет в списке API — сброс на дефолт (отдельно для 1:1 и 2:3)
|
|
@@ -103556,6 +103934,20 @@ function App() {
|
|
|
103556
103934
|
});
|
|
103557
103935
|
return result;
|
|
103558
103936
|
};
|
|
103937
|
+
/** Уведомление в Telegram, если в настройках заданы токен и chat id (только Electron). */
|
|
103938
|
+
const sendTelegramNotification = async (text) => {
|
|
103939
|
+
const api = getElectronAPI();
|
|
103940
|
+
const token = telegramBotToken.trim();
|
|
103941
|
+
const chat = telegramChatId.trim();
|
|
103942
|
+
if (!api?.telegramSendMessage || !token || !chat)
|
|
103943
|
+
return;
|
|
103944
|
+
try {
|
|
103945
|
+
await api.telegramSendMessage(token, chat, text);
|
|
103946
|
+
}
|
|
103947
|
+
catch {
|
|
103948
|
+
/* ignore */
|
|
103949
|
+
}
|
|
103950
|
+
};
|
|
103559
103951
|
/**
|
|
103560
103952
|
* Переводит массив сгенерированных пар на русский одним запросом.
|
|
103561
103953
|
* При ошибке выставляется pairTranslationFailed (кнопка «Запросить перевод»).
|
|
@@ -103620,6 +104012,7 @@ function App() {
|
|
|
103620
104012
|
setPairTranslations(translations);
|
|
103621
104013
|
setPairTranslationFailed(false);
|
|
103622
104014
|
logToTerminal('log', '[Translate RU] OK, пар переведено:', parsed.length);
|
|
104015
|
+
void sendTelegramNotification('Docs Combiner: тексты сгенерированы, перевод на русский выполнен.');
|
|
103623
104016
|
}
|
|
103624
104017
|
catch {
|
|
103625
104018
|
logToTerminal('warn', '[Translate RU] Ошибка запроса или разбора — см. консоль / лог');
|
|
@@ -103694,7 +104087,7 @@ function App() {
|
|
|
103694
104087
|
setPairTranslations({});
|
|
103695
104088
|
setPairTranslationFailed(false);
|
|
103696
104089
|
// Read pairs count from settings (3–10, default 3)
|
|
103697
|
-
const pairsCountInit = (0,
|
|
104090
|
+
const pairsCountInit = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getPairsCount)();
|
|
103698
104091
|
// Initialize placeholders
|
|
103699
104092
|
const initialTitles = Array.from({ length: pairsCountInit }, (_, index) => ({
|
|
103700
104093
|
index: index + 1,
|
|
@@ -103744,7 +104137,7 @@ function App() {
|
|
|
103744
104137
|
})));
|
|
103745
104138
|
await new Promise(r => setTimeout(r, CONTENT_GEN_RETRY_DELAY_MS));
|
|
103746
104139
|
}
|
|
103747
|
-
const selectedIndices = (0,
|
|
104140
|
+
const selectedIndices = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getSelectedPairApproaches)();
|
|
103748
104141
|
setLastUsedApproachIndices(selectedIndices);
|
|
103749
104142
|
const pairsCount = selectedIndices.length;
|
|
103750
104143
|
if (attempt === 1) {
|
|
@@ -103828,7 +104221,7 @@ function App() {
|
|
|
103828
104221
|
}
|
|
103829
104222
|
addLog(formatLogMessage('log', `✅ Successfully generated ${parsedTitles} title(s) and ${parsedTexts} text(s)`));
|
|
103830
104223
|
// Save generated content to Google Drive
|
|
103831
|
-
if (driveFolderUrl) {
|
|
104224
|
+
if (driveFolderUrl && !settingsFileMissingDialog.open) {
|
|
103832
104225
|
try {
|
|
103833
104226
|
const folderId = extractFolderId(driveFolderUrl);
|
|
103834
104227
|
if (folderId) {
|
|
@@ -103846,6 +104239,9 @@ function App() {
|
|
|
103846
104239
|
addLog(formatLogMessage('warn', `⚠️ Failed to save content to Google Drive: ${err.message || 'Unknown error'}`));
|
|
103847
104240
|
}
|
|
103848
104241
|
}
|
|
104242
|
+
else if (driveFolderUrl && settingsFileMissingDialog.open) {
|
|
104243
|
+
addLog(formatLogMessage('log', '⏸ Пропуск сохранения в Drive: ответьте в диалоге «настройки не найдены»'));
|
|
104244
|
+
}
|
|
103849
104245
|
const totalTime = Math.floor((Date.now() - startTime) / 1000);
|
|
103850
104246
|
addLog(formatLogMessage('log', `🎉 === Content generation completed ===`));
|
|
103851
104247
|
addLog(formatLogMessage('log', `⏱️ Total time: ${totalTime}s`));
|
|
@@ -104184,14 +104580,21 @@ function App() {
|
|
|
104184
104580
|
const oldStr = Number.isFinite(oldNum)
|
|
104185
104581
|
? (Number.isInteger(oldNum) ? String(oldNum) : (Math.round(oldNum * 100) / 100).toString().replace(/\.?0+$/, ''))
|
|
104186
104582
|
: '';
|
|
104187
|
-
priceBriefForValidation = `Новая цена по брифу (после скидки -50%): ${briefPrice} ${briefCurrency}${currencySymbol ? `, символ валюты: ${currencySymbol}` : ''}. ${Number.isFinite(oldNum) ? `Ожидаемая старая цена до скидки: ${oldStr} ${briefCurrency} (2× новой).` : 'Старая цена на макете должна быть в 2 раза больше новой.'} Любые другие суммы — ошибка «не совпадает с
|
|
104583
|
+
priceBriefForValidation = `Новая цена по брифу (после скидки -50%): ${briefPrice} ${briefCurrency}${currencySymbol ? `, символ валюты: ${currencySymbol}` : ''}. ${Number.isFinite(oldNum) ? `Ожидаемая старая цена до скидки: ${oldStr} ${briefCurrency} (2× новой).` : 'Старая цена на макете должна быть в 2 раза больше новой.'} Любые другие суммы — ошибка «не совпадает с брифом». На макете в зоне цен должна быть **именно эта валюта** (${briefCurrency}${currencySymbol ? ` или эквивалентный символ ${currencySymbol}` : ''}); иная валюта или её сокращения (например лв/BGN при EUR) — ошибка валидатора, нужна пересборка.`;
|
|
104188
104584
|
logMsg('log', `💶 Эталон цен для валидации: новая ${briefPrice} ${briefCurrency}${oldStr ? `, старая ${oldStr}` : ''}`);
|
|
104189
104585
|
}
|
|
104190
104586
|
else {
|
|
104191
104587
|
logMsg('log', '💶 Поле цены в приложении пустое — валидатор сверяет только визуал двух цен');
|
|
104192
104588
|
}
|
|
104589
|
+
const baseName = (0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getCreoApproachBaseNameFromImageLabel)(approachName?.trim() || '');
|
|
104590
|
+
const approachForBullets = _prompts__WEBPACK_IMPORTED_MODULE_2__.CREO_APPROACHES.find(a => a.name === baseName);
|
|
104591
|
+
const expectNoBullets = approachForBullets
|
|
104592
|
+
? (0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getEffectiveCreoNoBullets)(approachForBullets)
|
|
104593
|
+
: true;
|
|
104193
104594
|
const validationPrompt = (withProductReference ? `${(0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getValidationProductReferencePreamble)()}\n` : '') +
|
|
104194
|
-
(0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getValidationPrompt)(product, geo, keywords, approachName, undefined, priceBriefForValidation
|
|
104595
|
+
(0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getValidationPrompt)(product, geo, keywords, approachName, undefined, priceBriefForValidation, {
|
|
104596
|
+
expectNoBullets
|
|
104597
|
+
});
|
|
104195
104598
|
const visionContent = [
|
|
104196
104599
|
{ type: 'text', text: validationPrompt },
|
|
104197
104600
|
{ type: 'image_url', image_url: { url: imageUrl } }
|
|
@@ -104381,7 +104784,7 @@ function App() {
|
|
|
104381
104784
|
: status === 'needs_rebuild'
|
|
104382
104785
|
? (snippet
|
|
104383
104786
|
? [`Валидатор не выписал строки «ОШИБКА:». Фрагмент ответа: ${snippet}`]
|
|
104384
|
-
: ['Валидатор
|
|
104787
|
+
: ['Валидатор требует пересборки, а строки «ОШИБКА:» не разобрали. Сырой ответ/JSON — в «Полном ответе валидатора» под карточкой; при пустом контенте модели смотрите и лог.'])
|
|
104385
104788
|
: [];
|
|
104386
104789
|
if (truncatedByLimit) {
|
|
104387
104790
|
const truncationMsg = 'ОШИБКА: ответ валидатора обрезан по лимиту токенов (OpenRouter/провайдер вернули неполный текст — обычно finish_reason=length). Повторите проверку или выберите модель без тяжёлого reasoning.';
|
|
@@ -104398,7 +104801,7 @@ function App() {
|
|
|
104398
104801
|
}
|
|
104399
104802
|
return {
|
|
104400
104803
|
status,
|
|
104401
|
-
result: content,
|
|
104804
|
+
result: buildValidatorStoredResultText(content, data),
|
|
104402
104805
|
errors: finalErrors
|
|
104403
104806
|
};
|
|
104404
104807
|
};
|
|
@@ -104693,7 +105096,7 @@ function App() {
|
|
|
104693
105096
|
addLog(formatLogMessage(level, ...args));
|
|
104694
105097
|
};
|
|
104695
105098
|
logMsg('log', '📦 Creating ZIP archive with HTML and product image...');
|
|
104696
|
-
const zip = new (
|
|
105099
|
+
const zip = new (jszip__WEBPACK_IMPORTED_MODULE_67___default())();
|
|
104697
105100
|
// Replace product image path in HTML to match actual filename (png/jpg/webp)
|
|
104698
105101
|
const htmlWithProductPath = htmlContent.replace(/src=["']product\.(png|jpe?g|webp)["']/gi, `src="${productImageName}"`);
|
|
104699
105102
|
zip.file('index.html', htmlWithProductPath);
|
|
@@ -105037,7 +105440,7 @@ function App() {
|
|
|
105037
105440
|
const expandedTasks = (0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getCreoApproachExpandedTasks)();
|
|
105038
105441
|
if (expandedTasks.length === 0) {
|
|
105039
105442
|
addLog(formatLogMessage('error', '❌ Укажите количество изображений (хотя бы 1) в настройках подходов'));
|
|
105040
|
-
alert(`Укажите количество изображений (1–${
|
|
105443
|
+
alert(`Укажите количество изображений (1–${_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.MAX_IMAGES_PER_CREO_APPROACH}) хотя бы для одного подхода в настройках`);
|
|
105041
105444
|
setGeneratingImages(false);
|
|
105042
105445
|
return;
|
|
105043
105446
|
}
|
|
@@ -105089,16 +105492,104 @@ function App() {
|
|
|
105089
105492
|
}));
|
|
105090
105493
|
setGeneratedImagesData(initialPlaceholders);
|
|
105091
105494
|
addLog(formatLogMessage('log', `📝 Generated prompts for ${tasks.length} images${useBoth ? ' (1:1 + 2:3 на каждый подход)' : ''}`));
|
|
105092
|
-
const maxParallel =
|
|
105495
|
+
const maxParallel = 12;
|
|
105093
105496
|
addLog(formatLogMessage('log', `🚀 Generating ${tasks.length} images in parallel (up to ${maxParallel} at a time)...`));
|
|
105094
105497
|
const generationStartTime = Date.now();
|
|
105095
105498
|
const resultsMap = new Map();
|
|
105499
|
+
const validationTasks = [];
|
|
105096
105500
|
// Ensure each slot has prompt+product reference from the start (needed for regeneration even on failures)
|
|
105097
105501
|
setGeneratedImagesData(prev => prev.map((img, i) => ({
|
|
105098
105502
|
...img,
|
|
105099
105503
|
originalPrompt: img.originalPrompt || imagePrompts[i],
|
|
105100
105504
|
productImageUrl: img.productImageUrl || productImage.url
|
|
105101
105505
|
})));
|
|
105506
|
+
const runValidationForGeneratedImage = async (imageIndex, imageUrl, prompt, approachName, approachLabel, ratio) => {
|
|
105507
|
+
const validationResult = validationDisabled
|
|
105508
|
+
? { status: 'ok', result: 'Проверка отключена', errors: [], checkFailed: false }
|
|
105509
|
+
: await (async () => {
|
|
105510
|
+
try {
|
|
105511
|
+
const res = await validateCreativeImage(imageUrl, generateProduct, generateGeo, addLog, approachName, productImage.url);
|
|
105512
|
+
if (!res)
|
|
105513
|
+
throw new Error('No validation result');
|
|
105514
|
+
return { ...res, checkFailed: false };
|
|
105515
|
+
}
|
|
105516
|
+
catch (validationErr) {
|
|
105517
|
+
const msg = validationErr?.message || String(validationErr);
|
|
105518
|
+
addLog(formatLogMessage('error', `❌ Ошибка проверки изображения ${imageIndex}: ${msg}`));
|
|
105519
|
+
return {
|
|
105520
|
+
status: 'needs_rebuild',
|
|
105521
|
+
result: `Ошибка проверки: ${msg}`,
|
|
105522
|
+
errors: [msg],
|
|
105523
|
+
checkFailed: true
|
|
105524
|
+
};
|
|
105525
|
+
}
|
|
105526
|
+
})();
|
|
105527
|
+
let scheduleValidatorAutoRemake = false;
|
|
105528
|
+
const formattedValidationErrors = formatValidationErrorsForRegeneratePrompt(validationResult.errors);
|
|
105529
|
+
const validatorTransportRemake = validationResult.checkFailed === true;
|
|
105530
|
+
(0,react_dom__WEBPACK_IMPORTED_MODULE_1__.flushSync)(() => {
|
|
105531
|
+
setGeneratedImagesData(prev => {
|
|
105532
|
+
const cur = prev.find(i => i.index === imageIndex);
|
|
105533
|
+
const useAuto = shouldAutoRemakeAfterValidation(autoRemakeOnValidatorError, validationDisabled, validationResult, imageUrl, cur?.validatorTransportAutoRemakeDone);
|
|
105534
|
+
scheduleValidatorAutoRemake = useAuto;
|
|
105535
|
+
return prev.map(img => img.index === imageIndex
|
|
105536
|
+
? {
|
|
105537
|
+
...img,
|
|
105538
|
+
checking: false,
|
|
105539
|
+
checkFailed: validationResult.checkFailed ?? false,
|
|
105540
|
+
checkStatus: validationResult.status,
|
|
105541
|
+
checkResult: validationResult.result,
|
|
105542
|
+
checkErrors: validationResult.errors,
|
|
105543
|
+
customRegeneratePrompt: useAuto && validatorTransportRemake
|
|
105544
|
+
? ''
|
|
105545
|
+
: formattedValidationErrors,
|
|
105546
|
+
originalPrompt: img.originalPrompt || prompt,
|
|
105547
|
+
productImageUrl: img.productImageUrl || productImage.url,
|
|
105548
|
+
validatorTransportAutoRemakeDone: useAuto
|
|
105549
|
+
? true
|
|
105550
|
+
: (img.validatorTransportAutoRemakeDone ?? false)
|
|
105551
|
+
}
|
|
105552
|
+
: img);
|
|
105553
|
+
});
|
|
105554
|
+
});
|
|
105555
|
+
let verified;
|
|
105556
|
+
if (scheduleValidatorAutoRemake) {
|
|
105557
|
+
addLog(formatLogMessage('log', `🔄 Автопеределка с нуля изображения ${imageIndex} после ошибки валидатора (один раз)...`));
|
|
105558
|
+
const fr = await handleRegenerateImageFresh({
|
|
105559
|
+
index: imageIndex,
|
|
105560
|
+
approach: approachLabel,
|
|
105561
|
+
aspectRatio: ratio,
|
|
105562
|
+
originalPrompt: prompt,
|
|
105563
|
+
productImageUrl: productImage.url,
|
|
105564
|
+
creoApproachUiNumber: tasks[imageIndex - 1].poolIndex + 1,
|
|
105565
|
+
}, { fromAutoValidatorRemake: true });
|
|
105566
|
+
verified = fr?.verified === true;
|
|
105567
|
+
}
|
|
105568
|
+
else {
|
|
105569
|
+
verified = validationDisabled || validationResult.status === 'ok';
|
|
105570
|
+
if (shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, validationResult)) {
|
|
105571
|
+
const taskMeta = tasks[imageIndex - 1];
|
|
105572
|
+
if (taskMeta && folderId) {
|
|
105573
|
+
await creoAutoUploadAfterValidatorOkRef.current({
|
|
105574
|
+
imageData: {
|
|
105575
|
+
index: imageIndex,
|
|
105576
|
+
imageUrl,
|
|
105577
|
+
approach: approachLabel,
|
|
105578
|
+
creoApproachUiNumber: taskMeta.poolIndex + 1,
|
|
105579
|
+
aspectRatio: ratio,
|
|
105580
|
+
},
|
|
105581
|
+
folderId,
|
|
105582
|
+
validationResult,
|
|
105583
|
+
});
|
|
105584
|
+
}
|
|
105585
|
+
}
|
|
105586
|
+
}
|
|
105587
|
+
const existingResult = resultsMap.get(imageIndex);
|
|
105588
|
+
if (existingResult) {
|
|
105589
|
+
resultsMap.set(imageIndex, { ...existingResult, verified });
|
|
105590
|
+
}
|
|
105591
|
+
return { index: imageIndex, verified };
|
|
105592
|
+
};
|
|
105102
105593
|
const runOne = async (i, isRetry) => {
|
|
105103
105594
|
const imageIndex = i + 1;
|
|
105104
105595
|
const task = tasks[i];
|
|
@@ -105142,70 +105633,14 @@ function App() {
|
|
|
105142
105633
|
}
|
|
105143
105634
|
: img));
|
|
105144
105635
|
addLog(formatLogMessage('log', `✅ Изображение ${imageIndex}/${tasks.length} сгенерировано`));
|
|
105145
|
-
// Validate right after generation (skip if validation disabled)
|
|
105146
|
-
const validationResult = validationDisabled
|
|
105147
|
-
? { status: 'ok', result: 'Проверка отключена', errors: [], checkFailed: false }
|
|
105148
|
-
: await (async () => {
|
|
105149
|
-
try {
|
|
105150
|
-
const res = await validateCreativeImage(imageUrl, generateProduct, generateGeo, addLog, approachName, productImage.url);
|
|
105151
|
-
if (!res)
|
|
105152
|
-
throw new Error('No validation result');
|
|
105153
|
-
return { ...res, checkFailed: false };
|
|
105154
|
-
}
|
|
105155
|
-
catch (validationErr) {
|
|
105156
|
-
const msg = validationErr?.message || String(validationErr);
|
|
105157
|
-
addLog(formatLogMessage('error', `❌ Ошибка проверки изображения ${imageIndex}: ${msg}`));
|
|
105158
|
-
return {
|
|
105159
|
-
status: 'needs_rebuild',
|
|
105160
|
-
result: `Ошибка проверки: ${msg}`,
|
|
105161
|
-
errors: [msg],
|
|
105162
|
-
checkFailed: true
|
|
105163
|
-
};
|
|
105164
|
-
}
|
|
105165
|
-
})();
|
|
105166
105636
|
const approachLabel = approachName + (useBoth ? ` (${ratio})` : '');
|
|
105167
|
-
|
|
105168
|
-
|
|
105169
|
-
const validatorTransportRemake = validationResult.checkFailed === true;
|
|
105170
|
-
(0,react_dom__WEBPACK_IMPORTED_MODULE_1__.flushSync)(() => {
|
|
105171
|
-
setGeneratedImagesData(prev => {
|
|
105172
|
-
const cur = prev.find(i => i.index === imageIndex);
|
|
105173
|
-
const useAuto = shouldAutoRemakeAfterValidation(autoRemakeOnValidatorError, validationDisabled, validationResult, imageUrl, cur?.validatorTransportAutoRemakeDone);
|
|
105174
|
-
scheduleValidatorAutoRemake = useAuto;
|
|
105175
|
-
return prev.map(img => img.index === imageIndex
|
|
105176
|
-
? {
|
|
105177
|
-
...img,
|
|
105178
|
-
checking: false,
|
|
105179
|
-
checkFailed: validationResult.checkFailed ?? false,
|
|
105180
|
-
checkStatus: validationResult.status,
|
|
105181
|
-
checkResult: validationResult.result,
|
|
105182
|
-
checkErrors: validationResult.errors,
|
|
105183
|
-
customRegeneratePrompt: useAuto && validatorTransportRemake
|
|
105184
|
-
? ''
|
|
105185
|
-
: formattedValidationErrors,
|
|
105186
|
-
originalPrompt: img.originalPrompt || prompt,
|
|
105187
|
-
productImageUrl: img.productImageUrl || productImage.url,
|
|
105188
|
-
validatorTransportAutoRemakeDone: useAuto
|
|
105189
|
-
? true
|
|
105190
|
-
: (img.validatorTransportAutoRemakeDone ?? false)
|
|
105191
|
-
}
|
|
105192
|
-
: img);
|
|
105193
|
-
});
|
|
105194
|
-
});
|
|
105195
|
-
if (scheduleValidatorAutoRemake) {
|
|
105196
|
-
addLog(formatLogMessage('log', `🔄 Автопеределка с нуля изображения ${imageIndex} после ошибки валидатора (один раз)...`));
|
|
105197
|
-
await handleRegenerateImageFresh({
|
|
105198
|
-
index: imageIndex,
|
|
105199
|
-
approach: approachLabel,
|
|
105200
|
-
aspectRatio: ratio,
|
|
105201
|
-
originalPrompt: prompt,
|
|
105202
|
-
productImageUrl: productImage.url,
|
|
105203
|
-
}, { fromAutoValidatorRemake: true });
|
|
105204
|
-
}
|
|
105637
|
+
setCheckingImages(!validationDisabled);
|
|
105638
|
+
validationTasks.push(runValidationForGeneratedImage(imageIndex, imageUrl, prompt, approachName, approachLabel, ratio));
|
|
105205
105639
|
return {
|
|
105206
105640
|
index: imageIndex,
|
|
105207
105641
|
imageUrl,
|
|
105208
105642
|
success: true,
|
|
105643
|
+
verified: validationDisabled,
|
|
105209
105644
|
approach: approachName,
|
|
105210
105645
|
originalPrompt: prompt,
|
|
105211
105646
|
productImageUrl: productImage.url
|
|
@@ -105229,6 +105664,7 @@ function App() {
|
|
|
105229
105664
|
index: imageIndex,
|
|
105230
105665
|
imageUrl: null,
|
|
105231
105666
|
success: false,
|
|
105667
|
+
verified: false,
|
|
105232
105668
|
error: err,
|
|
105233
105669
|
approach: approachName,
|
|
105234
105670
|
originalPrompt: prompt,
|
|
@@ -105263,6 +105699,7 @@ function App() {
|
|
|
105263
105699
|
index: idx,
|
|
105264
105700
|
imageUrl: null,
|
|
105265
105701
|
success: false,
|
|
105702
|
+
verified: false,
|
|
105266
105703
|
error: new Error('Generation did not complete'),
|
|
105267
105704
|
approach: tasks[i]?.approach.name || 'Unknown',
|
|
105268
105705
|
originalPrompt: imagePrompts[i],
|
|
@@ -105318,6 +105755,24 @@ function App() {
|
|
|
105318
105755
|
await Promise.all(retryWorkers);
|
|
105319
105756
|
generationResults = Array.from(resultsMap.values()).sort((a, b) => a.index - b.index);
|
|
105320
105757
|
}
|
|
105758
|
+
if (validationTasks.length > 0) {
|
|
105759
|
+
addLog(formatLogMessage('log', `🔍 Ожидание проверок: ${validationTasks.length} задач(и)...`));
|
|
105760
|
+
const validationResults = await Promise.all(validationTasks.map(task => task.catch((err) => {
|
|
105761
|
+
const msg = err?.message || String(err);
|
|
105762
|
+
addLog(formatLogMessage('error', `❌ Ошибка задачи проверки: ${msg}`));
|
|
105763
|
+
return { index: -1, verified: false };
|
|
105764
|
+
})));
|
|
105765
|
+
validationResults.forEach(result => {
|
|
105766
|
+
if (result.index < 0)
|
|
105767
|
+
return;
|
|
105768
|
+
const existingResult = resultsMap.get(result.index);
|
|
105769
|
+
if (existingResult) {
|
|
105770
|
+
resultsMap.set(result.index, { ...existingResult, verified: result.verified });
|
|
105771
|
+
}
|
|
105772
|
+
});
|
|
105773
|
+
generationResults = Array.from(resultsMap.values()).sort((a, b) => a.index - b.index);
|
|
105774
|
+
setCheckingImages(false);
|
|
105775
|
+
}
|
|
105321
105776
|
const generationDuration = Date.now() - generationStartTime;
|
|
105322
105777
|
const successfulImages = generationResults.filter(r => r.success);
|
|
105323
105778
|
const finalFailedImages = generationResults.filter(r => !r.success);
|
|
@@ -105332,6 +105787,10 @@ function App() {
|
|
|
105332
105787
|
addLog(formatLogMessage('log', `🎉 === Image generation process completed ===`));
|
|
105333
105788
|
addLog(formatLogMessage('log', `⏱️ Total time: ${overallDuration}ms (${(overallDuration / 1000).toFixed(2)}s)`));
|
|
105334
105789
|
addLog(formatLogMessage('log', `✅ Successfully generated ${successfulImages.length}/${imagePrompts.length} images`));
|
|
105790
|
+
if (imagePrompts.length > 0 &&
|
|
105791
|
+
generationResults.every(r => r.success && r.verified)) {
|
|
105792
|
+
void sendTelegramNotification('Docs Combiner: все изображения сгенерированы и проверены.');
|
|
105793
|
+
}
|
|
105335
105794
|
// Stop generating state to hide backdrop and show images
|
|
105336
105795
|
setGeneratingImages(false);
|
|
105337
105796
|
setCheckingImages(false);
|
|
@@ -105345,10 +105804,12 @@ function App() {
|
|
|
105345
105804
|
}
|
|
105346
105805
|
finally {
|
|
105347
105806
|
setGeneratingImages(false);
|
|
105807
|
+
setCheckingImages(false);
|
|
105348
105808
|
}
|
|
105349
105809
|
}
|
|
105350
105810
|
catch (err) {
|
|
105351
105811
|
setGeneratingImages(false);
|
|
105812
|
+
setCheckingImages(false);
|
|
105352
105813
|
logToTerminal('error', '❌ Error:', err?.message || err);
|
|
105353
105814
|
}
|
|
105354
105815
|
};
|
|
@@ -105543,16 +106004,30 @@ ${imageData.originalPrompt}
|
|
|
105543
106004
|
// Run validation on the new image (skip if disabled)
|
|
105544
106005
|
let validationResult;
|
|
105545
106006
|
if (validationDisabled) {
|
|
105546
|
-
validationResult = { status: 'ok', result: 'Проверка отключена', errors: [] };
|
|
106007
|
+
validationResult = { status: 'ok', result: 'Проверка отключена', errors: [], checkFailed: false };
|
|
105547
106008
|
}
|
|
105548
106009
|
else {
|
|
105549
106010
|
addLog(formatLogMessage('log', `🔍 Проверка переделанного изображения ${imageData.index}...`));
|
|
105550
|
-
|
|
106011
|
+
try {
|
|
106012
|
+
const res = await validateCreativeImage(newImageUrl, generateProduct, generateGeo, addLog, imageData.approach, imageData.productImageUrl);
|
|
106013
|
+
validationResult = { ...res, checkFailed: false };
|
|
106014
|
+
}
|
|
106015
|
+
catch (validationErr) {
|
|
106016
|
+
const msg = validationErr?.message || String(validationErr);
|
|
106017
|
+
addLog(formatLogMessage('error', `❌ Ошибка проверки переделанного изображения ${imageData.index}: ${msg}`));
|
|
106018
|
+
validationResult = {
|
|
106019
|
+
status: 'needs_rebuild',
|
|
106020
|
+
result: `Ошибка проверки: ${msg}`,
|
|
106021
|
+
errors: [msg],
|
|
106022
|
+
checkFailed: true,
|
|
106023
|
+
};
|
|
106024
|
+
}
|
|
105551
106025
|
}
|
|
105552
106026
|
// Update with validation result (+ одна автопеределка при needs_rebuild с замечаниями, если включено)
|
|
105553
106027
|
const outcomeForAuto = {
|
|
105554
106028
|
status: validationResult.status,
|
|
105555
106029
|
errors: validationResult.errors,
|
|
106030
|
+
checkFailed: validationResult.checkFailed,
|
|
105556
106031
|
};
|
|
105557
106032
|
const formattedRegenErrors = formatValidationErrorsForRegeneratePrompt(validationResult.errors);
|
|
105558
106033
|
const regenTransportRemake = outcomeForAuto.checkFailed === true;
|
|
@@ -105566,6 +106041,7 @@ ${imageData.originalPrompt}
|
|
|
105566
106041
|
? {
|
|
105567
106042
|
...img,
|
|
105568
106043
|
checking: false,
|
|
106044
|
+
checkFailed: validationResult.checkFailed ?? false,
|
|
105569
106045
|
checkStatus: validationResult.status,
|
|
105570
106046
|
checkResult: validationResult.result,
|
|
105571
106047
|
checkErrors: validationResult.errors,
|
|
@@ -105587,8 +106063,26 @@ ${imageData.originalPrompt}
|
|
|
105587
106063
|
aspectRatio: imageData.aspectRatio,
|
|
105588
106064
|
originalPrompt: imageData.originalPrompt,
|
|
105589
106065
|
productImageUrl: imageData.productImageUrl,
|
|
106066
|
+
creoApproachUiNumber: currentImageData?.creoApproachUiNumber,
|
|
105590
106067
|
}, { fromAutoValidatorRemake: true });
|
|
105591
106068
|
}
|
|
106069
|
+
if (!scheduleAfterRegenValidation &&
|
|
106070
|
+
shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, validationResult)) {
|
|
106071
|
+
const creoNum = currentImageData?.creoApproachUiNumber ??
|
|
106072
|
+
generatedImagesData.find(img => img.index === imageData.index)?.creoApproachUiNumber ??
|
|
106073
|
+
1;
|
|
106074
|
+
await creoAutoUploadAfterValidatorOkRef.current({
|
|
106075
|
+
imageData: {
|
|
106076
|
+
index: imageData.index,
|
|
106077
|
+
imageUrl: updatedImageUrl,
|
|
106078
|
+
approach: imageData.approach,
|
|
106079
|
+
creoApproachUiNumber: creoNum,
|
|
106080
|
+
aspectRatio: imageData.aspectRatio,
|
|
106081
|
+
},
|
|
106082
|
+
folderId: regenFolderId,
|
|
106083
|
+
validationResult,
|
|
106084
|
+
});
|
|
106085
|
+
}
|
|
105592
106086
|
const statusEmoji = validationResult.status === 'ok' ? '✅' : '❌';
|
|
105593
106087
|
addLog(formatLogMessage('log', `${statusEmoji} Переделанное изображение ${imageData.index}: ${validationResult.status === 'ok' ? 'OK' : 'НУЖНА ПЕРЕСБОРКА'}`));
|
|
105594
106088
|
if (validationResult.errors.length > 0) {
|
|
@@ -105621,12 +106115,12 @@ ${imageData.originalPrompt}
|
|
|
105621
106115
|
const handleRegenerateImageFresh = async (imageData, opts) => {
|
|
105622
106116
|
if (!imageData.originalPrompt || !imageData.productImageUrl) {
|
|
105623
106117
|
alert('Не удалось найти оригинальный промпт или изображение продукта для переделки');
|
|
105624
|
-
return;
|
|
106118
|
+
return { verified: false };
|
|
105625
106119
|
}
|
|
105626
106120
|
const freshFolderId = extractFolderId(driveFolderUrl);
|
|
105627
106121
|
if (!freshFolderId) {
|
|
105628
106122
|
alert('Укажите корректный URL папки оффера на Google Drive');
|
|
105629
|
-
return;
|
|
106123
|
+
return { verified: false };
|
|
105630
106124
|
}
|
|
105631
106125
|
const addLog = (msg) => {
|
|
105632
106126
|
setImagesGenerationLogs(prev => [...prev, msg]);
|
|
@@ -105636,12 +106130,12 @@ ${imageData.originalPrompt}
|
|
|
105636
106130
|
const freshTok = await getValidAccessToken();
|
|
105637
106131
|
if (!freshTok) {
|
|
105638
106132
|
alert('Please log in with Google first');
|
|
105639
|
-
return;
|
|
106133
|
+
return { verified: false };
|
|
105640
106134
|
}
|
|
105641
106135
|
const freshPub = await verifyOfferFolderHasAnyoneLinkForImageGen(freshTok, freshFolderId);
|
|
105642
106136
|
if (!freshPub.ok) {
|
|
105643
106137
|
alert(freshPub.message);
|
|
105644
|
-
return;
|
|
106138
|
+
return { verified: false };
|
|
105645
106139
|
}
|
|
105646
106140
|
// Mark as regenerating (show overlay timer) - clear old image URL immediately to force re-render
|
|
105647
106141
|
setGeneratedImagesData(prev => prev.map(img => img.index === imageData.index
|
|
@@ -105699,15 +106193,29 @@ ${imageData.originalPrompt}
|
|
|
105699
106193
|
// Validate new image (skip if disabled)
|
|
105700
106194
|
let validationResult;
|
|
105701
106195
|
if (validationDisabled) {
|
|
105702
|
-
validationResult = { status: 'ok', result: 'Проверка отключена', errors: [] };
|
|
106196
|
+
validationResult = { status: 'ok', result: 'Проверка отключена', errors: [], checkFailed: false };
|
|
105703
106197
|
}
|
|
105704
106198
|
else {
|
|
105705
106199
|
addLog(formatLogMessage('log', `🔍 Проверка изображения ${imageData.index} (с нуля)...`));
|
|
105706
|
-
|
|
106200
|
+
try {
|
|
106201
|
+
const res = await validateCreativeImage(newImageUrl, generateProduct, generateGeo, addLog, imageData.approach, imageData.productImageUrl);
|
|
106202
|
+
validationResult = { ...res, checkFailed: false };
|
|
106203
|
+
}
|
|
106204
|
+
catch (validationErr) {
|
|
106205
|
+
const msg = validationErr?.message || String(validationErr);
|
|
106206
|
+
addLog(formatLogMessage('error', `❌ Ошибка проверки изображения ${imageData.index} (с нуля): ${msg}`));
|
|
106207
|
+
validationResult = {
|
|
106208
|
+
status: 'needs_rebuild',
|
|
106209
|
+
result: `Ошибка проверки: ${msg}`,
|
|
106210
|
+
errors: [msg],
|
|
106211
|
+
checkFailed: true,
|
|
106212
|
+
};
|
|
106213
|
+
}
|
|
105707
106214
|
}
|
|
105708
106215
|
const outcomeFresh = {
|
|
105709
106216
|
status: validationResult.status,
|
|
105710
106217
|
errors: validationResult.errors,
|
|
106218
|
+
checkFailed: validationResult.checkFailed,
|
|
105711
106219
|
};
|
|
105712
106220
|
const formattedFreshErrors = formatValidationErrorsForRegeneratePrompt(validationResult.errors);
|
|
105713
106221
|
const freshTransportRemake = outcomeFresh.checkFailed === true;
|
|
@@ -105721,6 +106229,7 @@ ${imageData.originalPrompt}
|
|
|
105721
106229
|
? {
|
|
105722
106230
|
...img,
|
|
105723
106231
|
checking: false,
|
|
106232
|
+
checkFailed: validationResult.checkFailed ?? false,
|
|
105724
106233
|
checkStatus: validationResult.status,
|
|
105725
106234
|
checkResult: validationResult.result,
|
|
105726
106235
|
checkErrors: validationResult.errors,
|
|
@@ -105736,14 +106245,34 @@ ${imageData.originalPrompt}
|
|
|
105736
106245
|
});
|
|
105737
106246
|
if (scheduleAfterFreshValidation && imageData.originalPrompt && imageData.productImageUrl) {
|
|
105738
106247
|
addLog(formatLogMessage('log', `🔄 Автопеределка с нуля изображения ${imageData.index} после ошибки валидатора (один раз)...`));
|
|
105739
|
-
await handleRegenerateImageFresh({
|
|
106248
|
+
return await handleRegenerateImageFresh({
|
|
105740
106249
|
index: imageData.index,
|
|
105741
106250
|
approach: imageData.approach,
|
|
105742
106251
|
aspectRatio: imageData.aspectRatio,
|
|
105743
106252
|
originalPrompt: imageData.originalPrompt,
|
|
105744
106253
|
productImageUrl: imageData.productImageUrl,
|
|
106254
|
+
creoApproachUiNumber: imageData.creoApproachUiNumber,
|
|
105745
106255
|
}, { fromAutoValidatorRemake: true });
|
|
105746
106256
|
}
|
|
106257
|
+
const creoApproachUiNumberFresh = imageData.creoApproachUiNumber ??
|
|
106258
|
+
generatedImagesData.find(img => img.index === imageData.index)?.creoApproachUiNumber ??
|
|
106259
|
+
1;
|
|
106260
|
+
if (shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, validationResult)) {
|
|
106261
|
+
await creoAutoUploadAfterValidatorOkRef.current({
|
|
106262
|
+
imageData: {
|
|
106263
|
+
index: imageData.index,
|
|
106264
|
+
imageUrl: updatedImageUrl,
|
|
106265
|
+
approach: imageData.approach,
|
|
106266
|
+
creoApproachUiNumber: creoApproachUiNumberFresh,
|
|
106267
|
+
aspectRatio: imageData.aspectRatio,
|
|
106268
|
+
},
|
|
106269
|
+
folderId: freshFolderId,
|
|
106270
|
+
validationResult,
|
|
106271
|
+
});
|
|
106272
|
+
}
|
|
106273
|
+
return {
|
|
106274
|
+
verified: validationDisabled || validationResult.status === 'ok',
|
|
106275
|
+
};
|
|
105747
106276
|
}
|
|
105748
106277
|
catch (err) {
|
|
105749
106278
|
addLog(formatLogMessage('error', `❌ Ошибка при переделке заново изображения ${imageData.index}: ${err.message}`));
|
|
@@ -105760,6 +106289,7 @@ ${imageData.originalPrompt}
|
|
|
105760
106289
|
}
|
|
105761
106290
|
: img));
|
|
105762
106291
|
alert('Ошибка при переделке заново: ' + err.message);
|
|
106292
|
+
return { verified: false };
|
|
105763
106293
|
}
|
|
105764
106294
|
};
|
|
105765
106295
|
const handleRetryCheck = async (imageData) => {
|
|
@@ -105829,6 +106359,8 @@ ${imageData.originalPrompt}
|
|
|
105829
106359
|
aspectRatio: imageData.aspectRatio,
|
|
105830
106360
|
originalPrompt: imageData.originalPrompt,
|
|
105831
106361
|
productImageUrl: imageData.productImageUrl,
|
|
106362
|
+
creoApproachUiNumber: imageData.creoApproachUiNumber ??
|
|
106363
|
+
generatedImagesData.find(img => img.index === imageData.index)?.creoApproachUiNumber,
|
|
105832
106364
|
}, { fromAutoValidatorRemake: true });
|
|
105833
106365
|
}
|
|
105834
106366
|
return;
|
|
@@ -105869,8 +106401,30 @@ ${imageData.originalPrompt}
|
|
|
105869
106401
|
aspectRatio: imageData.aspectRatio,
|
|
105870
106402
|
originalPrompt: imageData.originalPrompt,
|
|
105871
106403
|
productImageUrl: imageData.productImageUrl,
|
|
106404
|
+
creoApproachUiNumber: imageData.creoApproachUiNumber ??
|
|
106405
|
+
generatedImagesData.find(img => img.index === imageData.index)?.creoApproachUiNumber,
|
|
105872
106406
|
}, { fromAutoValidatorRemake: true });
|
|
105873
106407
|
}
|
|
106408
|
+
if (!scheduleValidatorAutoRemakeRetry &&
|
|
106409
|
+
shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, validationResult)) {
|
|
106410
|
+
const retryFid = extractFolderId(driveFolderUrl);
|
|
106411
|
+
if (retryFid && imageData.imageUrl) {
|
|
106412
|
+
const creoNum = imageData.creoApproachUiNumber ??
|
|
106413
|
+
generatedImagesData.find(img => img.index === imageData.index)?.creoApproachUiNumber ??
|
|
106414
|
+
1;
|
|
106415
|
+
await creoAutoUploadAfterValidatorOkRef.current({
|
|
106416
|
+
imageData: {
|
|
106417
|
+
index: imageData.index,
|
|
106418
|
+
imageUrl: imageData.imageUrl,
|
|
106419
|
+
approach: imageData.approach,
|
|
106420
|
+
creoApproachUiNumber: creoNum,
|
|
106421
|
+
aspectRatio: imageData.aspectRatio,
|
|
106422
|
+
},
|
|
106423
|
+
folderId: retryFid,
|
|
106424
|
+
validationResult,
|
|
106425
|
+
});
|
|
106426
|
+
}
|
|
106427
|
+
}
|
|
105874
106428
|
const statusEmoji = validationResult.status === 'ok' ? '✅' : '❌';
|
|
105875
106429
|
addLog(formatLogMessage('log', `${statusEmoji} Повторная проверка изображения ${imageData.index}: ${validationResult.status === 'ok' ? 'OK' : 'НУЖНА ПЕРЕСБОРКА'}`));
|
|
105876
106430
|
};
|
|
@@ -105913,7 +106467,15 @@ ${imageData.originalPrompt}
|
|
|
105913
106467
|
: img));
|
|
105914
106468
|
}
|
|
105915
106469
|
};
|
|
105916
|
-
|
|
106470
|
+
creoAutoUploadAfterValidatorOkRef.current = async (args) => {
|
|
106471
|
+
if (!shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, args.validationResult)) {
|
|
106472
|
+
return;
|
|
106473
|
+
}
|
|
106474
|
+
if (!args.folderId?.trim() || !args.imageData.imageUrl?.trim())
|
|
106475
|
+
return;
|
|
106476
|
+
await handleUploadImage(args.imageData, args.folderId);
|
|
106477
|
+
};
|
|
106478
|
+
const handleUploadAllImages = async (opts) => {
|
|
105917
106479
|
if (!driveFolderUrl.trim()) {
|
|
105918
106480
|
alert('Please fill in Google Drive Folder URL');
|
|
105919
106481
|
return;
|
|
@@ -105923,9 +106485,11 @@ ${imageData.originalPrompt}
|
|
|
105923
106485
|
alert('Invalid Google Drive Folder URL');
|
|
105924
106486
|
return;
|
|
105925
106487
|
}
|
|
105926
|
-
const notUploaded =
|
|
106488
|
+
const notUploaded = opts?.correctOnly ? pendingValidatorOkDriveUploadCreos : pendingDriveUploadCreos;
|
|
105927
106489
|
if (notUploaded.length === 0) {
|
|
105928
|
-
alert(
|
|
106490
|
+
alert(opts?.correctOnly
|
|
106491
|
+
? 'Нет незагруженных крео с успешной проверкой валидатором (зелёная рамка, «Проверка пройдена»).'
|
|
106492
|
+
: 'All images are already uploaded');
|
|
105929
106493
|
return;
|
|
105930
106494
|
}
|
|
105931
106495
|
setUploadingImages(true);
|
|
@@ -105938,7 +106502,9 @@ ${imageData.originalPrompt}
|
|
|
105938
106502
|
? { ...img, uploading: true, uploadStartTime: Date.now() }
|
|
105939
106503
|
: img));
|
|
105940
106504
|
try {
|
|
105941
|
-
addLog(formatLogMessage('log',
|
|
106505
|
+
addLog(formatLogMessage('log', opts?.correctOnly
|
|
106506
|
+
? `📤 Uploading ${notUploaded.length} image(s) with validator OK to Drive (parallel)...`
|
|
106507
|
+
: `📤 Uploading ${notUploaded.length} image(s) to Drive (parallel)...`));
|
|
105942
106508
|
const results = await Promise.allSettled(notUploaded.map((imageData) => {
|
|
105943
106509
|
const uploadAspect = imageData.aspectRatio ?? (imageAspectRatio === '2:3' ? '2:3' : '1:1');
|
|
105944
106510
|
const filename = creativeImageUploadFilename(imageData.creoApproachUiNumber, uploadAspect);
|
|
@@ -106106,6 +106672,19 @@ ${imageData.originalPrompt}
|
|
|
106106
106672
|
alert('Не удалось прочитать буфер обмена. Разрешите доступ к буферу в браузере или вставьте ссылку вручную (Ctrl+V / Cmd+V).');
|
|
106107
106673
|
}
|
|
106108
106674
|
};
|
|
106675
|
+
const handlePasteFlexcardApiKey = async () => {
|
|
106676
|
+
try {
|
|
106677
|
+
const text = (await navigator.clipboard.readText()).trim();
|
|
106678
|
+
if (!text) {
|
|
106679
|
+
alert('Буфер обмена пуст.');
|
|
106680
|
+
return;
|
|
106681
|
+
}
|
|
106682
|
+
handleFlexcardApiKeyChange(text);
|
|
106683
|
+
}
|
|
106684
|
+
catch {
|
|
106685
|
+
alert('Не удалось прочитать буфер обмена. Разрешите доступ к буферу в браузере или вставьте ключ вручную (Ctrl+V / Cmd+V).');
|
|
106686
|
+
}
|
|
106687
|
+
};
|
|
106109
106688
|
const handleLinkPaste = (e) => {
|
|
106110
106689
|
e.preventDefault();
|
|
106111
106690
|
const pasted = e.clipboardData.getData('text/plain');
|
|
@@ -106325,8 +106904,8 @@ ${imageData.originalPrompt}
|
|
|
106325
106904
|
catalogUrlCreoApproachParam,
|
|
106326
106905
|
catalogUrlImageAspectParam,
|
|
106327
106906
|
catalogLinkExtraMacros,
|
|
106328
|
-
selectedPairApproaches: (0,
|
|
106329
|
-
imageApproachCounts: (0,
|
|
106907
|
+
selectedPairApproaches: (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getSelectedPairApproaches)(),
|
|
106908
|
+
imageApproachCounts: (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getImageApproachCounts)(),
|
|
106330
106909
|
savedAt: new Date().toISOString()
|
|
106331
106910
|
};
|
|
106332
106911
|
const jsonContent = JSON.stringify(dataToSave, null, 2);
|
|
@@ -106400,137 +106979,182 @@ ${imageData.originalPrompt}
|
|
|
106400
106979
|
};
|
|
106401
106980
|
// Load generated content from Google Drive
|
|
106402
106981
|
const loadGeneratedContentFromDrive = async (folderId) => {
|
|
106403
|
-
|
|
106404
|
-
|
|
106405
|
-
|
|
106406
|
-
|
|
106407
|
-
|
|
106408
|
-
|
|
106409
|
-
|
|
106410
|
-
|
|
106411
|
-
|
|
106412
|
-
|
|
106413
|
-
|
|
106414
|
-
|
|
106415
|
-
|
|
106416
|
-
|
|
106417
|
-
|
|
106418
|
-
const
|
|
106419
|
-
|
|
106420
|
-
|
|
106421
|
-
|
|
106422
|
-
|
|
106982
|
+
try {
|
|
106983
|
+
logToTerminal('log', '[Load Content] Starting load from Google Drive, folderId:', folderId);
|
|
106984
|
+
const validToken = await getValidAccessToken();
|
|
106985
|
+
if (!validToken) {
|
|
106986
|
+
logToTerminal('warn', '[Load Content] No valid token, skipping load');
|
|
106987
|
+
setDriveFilesFound(prev => ({ ...prev, content: false }));
|
|
106988
|
+
return { found: false };
|
|
106989
|
+
}
|
|
106990
|
+
// 1) Корень папки проекта; 2) иначе legacy: папка env (без создания env)
|
|
106991
|
+
let fileId = await findSettingsFileInFolder(folderId);
|
|
106992
|
+
if (fileId) {
|
|
106993
|
+
logToTerminal('log', '[Load Content] Found settings in project root');
|
|
106994
|
+
}
|
|
106995
|
+
else {
|
|
106996
|
+
const envIds = await findEnvFolderIds(folderId);
|
|
106997
|
+
for (const envFolderId of envIds) {
|
|
106998
|
+
const id = await findSettingsFileInFolder(envFolderId);
|
|
106999
|
+
if (id) {
|
|
107000
|
+
fileId = id;
|
|
107001
|
+
logToTerminal('log', '[Load Content] Found settings in legacy env folder:', envFolderId);
|
|
107002
|
+
break;
|
|
107003
|
+
}
|
|
106423
107004
|
}
|
|
106424
107005
|
}
|
|
106425
|
-
|
|
106426
|
-
|
|
106427
|
-
|
|
106428
|
-
|
|
106429
|
-
return { found: false };
|
|
106430
|
-
}
|
|
106431
|
-
setDriveFilesFound(prev => ({ ...prev, content: true }));
|
|
106432
|
-
logToTerminal('log', '[Load Content] File found, id:', fileId);
|
|
106433
|
-
// Download file content
|
|
106434
|
-
const downloadUrl = `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media`;
|
|
106435
|
-
const downloadResponse = await fetch(downloadUrl, {
|
|
106436
|
-
headers: {
|
|
106437
|
-
'Authorization': `Bearer ${validToken}`
|
|
107006
|
+
if (!fileId) {
|
|
107007
|
+
logToTerminal('log', `[Load Content] No settings file (${PROJECT_SETTINGS_FILENAME} or ${LEGACY_PROJECT_SETTINGS_FILENAME}) in root or env`);
|
|
107008
|
+
setDriveFilesFound(prev => ({ ...prev, content: false }));
|
|
107009
|
+
return { found: false, noSettingsFile: true };
|
|
106438
107010
|
}
|
|
106439
|
-
|
|
106440
|
-
|
|
106441
|
-
|
|
106442
|
-
|
|
106443
|
-
|
|
106444
|
-
|
|
106445
|
-
|
|
106446
|
-
|
|
106447
|
-
|
|
106448
|
-
|
|
106449
|
-
|
|
106450
|
-
|
|
106451
|
-
|
|
106452
|
-
|
|
106453
|
-
|
|
106454
|
-
|
|
106455
|
-
|
|
106456
|
-
|
|
106457
|
-
|
|
106458
|
-
|
|
107011
|
+
setDriveFilesFound(prev => ({ ...prev, content: true }));
|
|
107012
|
+
logToTerminal('log', '[Load Content] File found, id:', fileId);
|
|
107013
|
+
// Download file content
|
|
107014
|
+
const downloadUrl = `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media`;
|
|
107015
|
+
const downloadResponse = await fetch(downloadUrl, {
|
|
107016
|
+
headers: {
|
|
107017
|
+
'Authorization': `Bearer ${validToken}`
|
|
107018
|
+
}
|
|
107019
|
+
});
|
|
107020
|
+
if (!downloadResponse.ok) {
|
|
107021
|
+
const errorText = await downloadResponse.text();
|
|
107022
|
+
logToTerminal('warn', '[Load Content] Download failed, status:', downloadResponse.status, 'error:', errorText);
|
|
107023
|
+
setDriveFilesFound(prev => ({ ...prev, content: false }));
|
|
107024
|
+
return { found: false };
|
|
107025
|
+
}
|
|
107026
|
+
const jsonContent = await downloadResponse.text();
|
|
107027
|
+
logToTerminal('log', '[Load Content] File downloaded, length:', jsonContent.length);
|
|
107028
|
+
try {
|
|
107029
|
+
const loadedData = JSON.parse(jsonContent);
|
|
107030
|
+
logToTerminal('log', '[Load Content] Parsed settings');
|
|
107031
|
+
// Titles and texts are not loaded from Drive (no longer saved there)
|
|
107032
|
+
// Load AI Generation Settings
|
|
107033
|
+
if (loadedData.aiGenerationSettings) {
|
|
107034
|
+
logToTerminal('log', '[Load Content] Loading AI Generation Settings');
|
|
107035
|
+
const settings = loadedData.aiGenerationSettings;
|
|
107036
|
+
if (settings.generateProduct) {
|
|
107037
|
+
setGenerateProduct(settings.generateProduct);
|
|
107038
|
+
logToTerminal('log', '[Load Content] Loaded generateProduct:', settings.generateProduct);
|
|
107039
|
+
}
|
|
107040
|
+
if (settings.generateGeo) {
|
|
107041
|
+
setGenerateGeo(settings.generateGeo);
|
|
107042
|
+
logToTerminal('log', '[Load Content] Loaded generateGeo:', settings.generateGeo);
|
|
107043
|
+
}
|
|
107044
|
+
if (settings.generateAdditionalInfo !== undefined) {
|
|
107045
|
+
setGenerateAdditionalInfo(settings.generateAdditionalInfo);
|
|
107046
|
+
logToTerminal('log', '[Load Content] Loaded generateAdditionalInfo');
|
|
107047
|
+
}
|
|
107048
|
+
if (settings.generatePriceWithCurrency) {
|
|
107049
|
+
setGeneratePriceWithCurrency(settings.generatePriceWithCurrency);
|
|
107050
|
+
logToTerminal('log', '[Load Content] Loaded generatePriceWithCurrency:', settings.generatePriceWithCurrency);
|
|
107051
|
+
}
|
|
106459
107052
|
}
|
|
106460
|
-
|
|
106461
|
-
|
|
106462
|
-
|
|
107053
|
+
// Load link (brand is auto-generated from product, geo, price)
|
|
107054
|
+
if (loadedData.link !== undefined) {
|
|
107055
|
+
setLink(loadedData.link || '');
|
|
107056
|
+
logToTerminal('log', '[Load Content] Loaded link:', loadedData.link || '(empty)');
|
|
106463
107057
|
}
|
|
106464
|
-
if (
|
|
106465
|
-
|
|
106466
|
-
logToTerminal('log', '[Load Content] Loaded generateAdditionalInfo');
|
|
107058
|
+
if (typeof loadedData.catalogUrlIncludeTextApproach === 'boolean') {
|
|
107059
|
+
setCatalogUrlIncludeTextApproach(loadedData.catalogUrlIncludeTextApproach);
|
|
106467
107060
|
}
|
|
106468
|
-
if (
|
|
106469
|
-
|
|
106470
|
-
logToTerminal('log', '[Load Content] Loaded generatePriceWithCurrency:', settings.generatePriceWithCurrency);
|
|
107061
|
+
if (typeof loadedData.catalogUrlIncludeCreoApproach === 'boolean') {
|
|
107062
|
+
setCatalogUrlIncludeCreoApproach(loadedData.catalogUrlIncludeCreoApproach);
|
|
106471
107063
|
}
|
|
107064
|
+
if (typeof loadedData.catalogUrlTextApproachParam === 'string' && loadedData.catalogUrlTextApproachParam.trim()) {
|
|
107065
|
+
setCatalogUrlTextApproachParam(loadedData.catalogUrlTextApproachParam.trim());
|
|
107066
|
+
}
|
|
107067
|
+
if (typeof loadedData.catalogUrlCreoApproachParam === 'string' && loadedData.catalogUrlCreoApproachParam.trim()) {
|
|
107068
|
+
setCatalogUrlCreoApproachParam(loadedData.catalogUrlCreoApproachParam.trim());
|
|
107069
|
+
}
|
|
107070
|
+
if (typeof loadedData.catalogUrlIncludeImageAspect === 'boolean') {
|
|
107071
|
+
setCatalogUrlIncludeImageAspect(loadedData.catalogUrlIncludeImageAspect);
|
|
107072
|
+
}
|
|
107073
|
+
if (typeof loadedData.catalogUrlImageAspectParam === 'string' && loadedData.catalogUrlImageAspectParam.trim()) {
|
|
107074
|
+
setCatalogUrlImageAspectParam(loadedData.catalogUrlImageAspectParam.trim());
|
|
107075
|
+
}
|
|
107076
|
+
if (typeof loadedData.catalogLinkExtraMacros === 'string') {
|
|
107077
|
+
setCatalogLinkExtraMacros(loadedData.catalogLinkExtraMacros);
|
|
107078
|
+
}
|
|
107079
|
+
else {
|
|
107080
|
+
setCatalogLinkExtraMacros(DEFAULT_CATALOG_LINK_EXTRA_MACROS);
|
|
107081
|
+
}
|
|
107082
|
+
const parsedApproaches = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.parseApproachesFromDriveData)(loadedData);
|
|
107083
|
+
const currentPairs = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getSelectedPairApproaches)();
|
|
107084
|
+
const currentCounts = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getImageApproachCounts)();
|
|
107085
|
+
const hasDrivePairs = parsedApproaches.pairs !== null;
|
|
107086
|
+
const hasDriveCounts = parsedApproaches.counts !== null;
|
|
107087
|
+
if (hasDrivePairs || hasDriveCounts) {
|
|
107088
|
+
const pairsDiffer = hasDrivePairs && !sortedPairIndicesEqual(parsedApproaches.pairs, currentPairs);
|
|
107089
|
+
const countsDiffer = hasDriveCounts && !imageApproachCountsEqual(parsedApproaches.counts, currentCounts);
|
|
107090
|
+
if (pairsDiffer || countsDiffer) {
|
|
107091
|
+
setApproachLoadChoice({
|
|
107092
|
+
savedPairs: parsedApproaches.pairs,
|
|
107093
|
+
savedCounts: parsedApproaches.counts,
|
|
107094
|
+
currentPairs,
|
|
107095
|
+
currentCounts,
|
|
107096
|
+
});
|
|
107097
|
+
logToTerminal('log', '[Load Content] Offer file contains approach settings — asking user to apply or keep current');
|
|
107098
|
+
}
|
|
107099
|
+
}
|
|
107100
|
+
logToTerminal('log', '[Load Content] Successfully loaded content');
|
|
107101
|
+
setDriveFilesFound(prev => ({ ...prev, content: false }));
|
|
107102
|
+
return { found: true };
|
|
106472
107103
|
}
|
|
106473
|
-
|
|
106474
|
-
|
|
106475
|
-
|
|
106476
|
-
|
|
106477
|
-
}
|
|
106478
|
-
if (typeof loadedData.catalogUrlIncludeTextApproach === 'boolean') {
|
|
106479
|
-
setCatalogUrlIncludeTextApproach(loadedData.catalogUrlIncludeTextApproach);
|
|
106480
|
-
}
|
|
106481
|
-
if (typeof loadedData.catalogUrlIncludeCreoApproach === 'boolean') {
|
|
106482
|
-
setCatalogUrlIncludeCreoApproach(loadedData.catalogUrlIncludeCreoApproach);
|
|
106483
|
-
}
|
|
106484
|
-
if (typeof loadedData.catalogUrlTextApproachParam === 'string' && loadedData.catalogUrlTextApproachParam.trim()) {
|
|
106485
|
-
setCatalogUrlTextApproachParam(loadedData.catalogUrlTextApproachParam.trim());
|
|
106486
|
-
}
|
|
106487
|
-
if (typeof loadedData.catalogUrlCreoApproachParam === 'string' && loadedData.catalogUrlCreoApproachParam.trim()) {
|
|
106488
|
-
setCatalogUrlCreoApproachParam(loadedData.catalogUrlCreoApproachParam.trim());
|
|
106489
|
-
}
|
|
106490
|
-
if (typeof loadedData.catalogUrlIncludeImageAspect === 'boolean') {
|
|
106491
|
-
setCatalogUrlIncludeImageAspect(loadedData.catalogUrlIncludeImageAspect);
|
|
106492
|
-
}
|
|
106493
|
-
if (typeof loadedData.catalogUrlImageAspectParam === 'string' && loadedData.catalogUrlImageAspectParam.trim()) {
|
|
106494
|
-
setCatalogUrlImageAspectParam(loadedData.catalogUrlImageAspectParam.trim());
|
|
107104
|
+
catch (err) {
|
|
107105
|
+
logToTerminal('error', '[Load Content] Failed to parse loaded content:', err);
|
|
107106
|
+
setDriveFilesFound(prev => ({ ...prev, content: false }));
|
|
107107
|
+
return { found: false };
|
|
106495
107108
|
}
|
|
106496
|
-
|
|
106497
|
-
|
|
107109
|
+
}
|
|
107110
|
+
catch (err) {
|
|
107111
|
+
logToTerminal('error', '[Load Content] Error loading settings from Drive:', err);
|
|
107112
|
+
setDriveFilesFound(prev => ({ ...prev, content: false }));
|
|
107113
|
+
return { found: false };
|
|
107114
|
+
}
|
|
107115
|
+
};
|
|
107116
|
+
const handleSettingsFileMissingDismissOk = () => {
|
|
107117
|
+
const id = settingsFileMissingDialog.folderId;
|
|
107118
|
+
if (id) {
|
|
107119
|
+
dismissedSettingsMissingForFolderRef.current.add(id);
|
|
107120
|
+
}
|
|
107121
|
+
setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
|
|
107122
|
+
};
|
|
107123
|
+
const handleSettingsFileMissingRetry = async () => {
|
|
107124
|
+
const folderId = settingsFileMissingDialog.folderId;
|
|
107125
|
+
if (!folderId)
|
|
107126
|
+
return;
|
|
107127
|
+
setSettingsFileMissingDialog(s => ({ ...s, retrying: true }));
|
|
107128
|
+
setLoadingContentFromDrive(true);
|
|
107129
|
+
try {
|
|
107130
|
+
await new Promise(r => {
|
|
107131
|
+
setTimeout(r, 500);
|
|
107132
|
+
});
|
|
107133
|
+
const result = await loadGeneratedContentFromDrive(folderId);
|
|
107134
|
+
if (result.found) {
|
|
107135
|
+
setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
|
|
106498
107136
|
}
|
|
106499
107137
|
else {
|
|
106500
|
-
|
|
106501
|
-
|
|
106502
|
-
|
|
106503
|
-
|
|
106504
|
-
|
|
106505
|
-
const hasDrivePairs = parsedApproaches.pairs !== null;
|
|
106506
|
-
const hasDriveCounts = parsedApproaches.counts !== null;
|
|
106507
|
-
if (hasDrivePairs || hasDriveCounts) {
|
|
106508
|
-
const pairsDiffer = hasDrivePairs && !sortedPairIndicesEqual(parsedApproaches.pairs, currentPairs);
|
|
106509
|
-
const countsDiffer = hasDriveCounts && !imageApproachCountsEqual(parsedApproaches.counts, currentCounts);
|
|
106510
|
-
if (pairsDiffer || countsDiffer) {
|
|
106511
|
-
setApproachLoadChoice({
|
|
106512
|
-
savedPairs: parsedApproaches.pairs,
|
|
106513
|
-
savedCounts: parsedApproaches.counts,
|
|
106514
|
-
currentPairs,
|
|
106515
|
-
currentCounts,
|
|
106516
|
-
});
|
|
106517
|
-
logToTerminal('log', '[Load Content] Offer file contains approach settings — asking user to apply or keep current');
|
|
107138
|
+
if (result.noSettingsFile) {
|
|
107139
|
+
setSettingsFileMissingDialog(s => ({ ...s, retrying: false }));
|
|
107140
|
+
}
|
|
107141
|
+
else {
|
|
107142
|
+
setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
|
|
106518
107143
|
}
|
|
106519
107144
|
}
|
|
106520
|
-
logToTerminal('log', '[Load Content] Successfully loaded content');
|
|
106521
|
-
setDriveFilesFound(prev => ({ ...prev, content: false }));
|
|
106522
|
-
return { found: true };
|
|
106523
107145
|
}
|
|
106524
|
-
catch (
|
|
106525
|
-
logToTerminal('error', '[Load Content]
|
|
106526
|
-
|
|
106527
|
-
|
|
107146
|
+
catch (e) {
|
|
107147
|
+
logToTerminal('error', '[Load Content] Retry after missing settings failed:', e);
|
|
107148
|
+
setSettingsFileMissingDialog(s => ({ ...s, retrying: false }));
|
|
107149
|
+
}
|
|
107150
|
+
finally {
|
|
107151
|
+
setLoadingContentFromDrive(false);
|
|
106528
107152
|
}
|
|
106529
107153
|
};
|
|
106530
107154
|
const handleApproachLoadApplyFromFile = () => {
|
|
106531
107155
|
if (!approachLoadChoice)
|
|
106532
107156
|
return;
|
|
106533
|
-
const applied = (0,
|
|
107157
|
+
const applied = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.applyParsedApproachesFromDrive)(approachLoadChoice.savedPairs, approachLoadChoice.savedCounts);
|
|
106534
107158
|
if (applied) {
|
|
106535
107159
|
logToTerminal('log', '[Load Content] Applied approach settings from offer file (user choice)');
|
|
106536
107160
|
}
|
|
@@ -106543,6 +107167,8 @@ ${imageData.originalPrompt}
|
|
|
106543
107167
|
syncDriveAfterPromptSaveRef.current = () => {
|
|
106544
107168
|
if (!driveFolderUrl || loadingContentFromDrive)
|
|
106545
107169
|
return;
|
|
107170
|
+
if (settingsFileMissingDialog.open)
|
|
107171
|
+
return;
|
|
106546
107172
|
const folderId = extractFolderId(driveFolderUrl);
|
|
106547
107173
|
if (!folderId)
|
|
106548
107174
|
return;
|
|
@@ -106558,8 +107184,8 @@ ${imageData.originalPrompt}
|
|
|
106558
107184
|
};
|
|
106559
107185
|
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
106560
107186
|
const listener = () => syncDriveAfterPromptSaveRef.current();
|
|
106561
|
-
window.addEventListener(
|
|
106562
|
-
return () => window.removeEventListener(
|
|
107187
|
+
window.addEventListener(_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.PROMPT_OVERRIDES_SAVED_EVENT, listener);
|
|
107188
|
+
return () => window.removeEventListener(_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.PROMPT_OVERRIDES_SAVED_EVENT, listener);
|
|
106563
107189
|
}, []);
|
|
106564
107190
|
const handleGenerate = async () => {
|
|
106565
107191
|
if (!driveFolderUrl || !brand || !link) {
|
|
@@ -106660,8 +107286,8 @@ ${imageData.originalPrompt}
|
|
|
106660
107286
|
}
|
|
106661
107287
|
setGeneratedData(rows);
|
|
106662
107288
|
// Create workbook
|
|
106663
|
-
const wb =
|
|
106664
|
-
const ws =
|
|
107289
|
+
const wb = xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.book_new();
|
|
107290
|
+
const ws = xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.aoa_to_sheet(rows);
|
|
106665
107291
|
// Set column widths (approximate pixel width / 7)
|
|
106666
107292
|
ws['!cols'] = [
|
|
106667
107293
|
{ wch: 20 }, // id
|
|
@@ -106674,9 +107300,9 @@ ${imageData.originalPrompt}
|
|
|
106674
107300
|
{ wch: 40 }, // image_link
|
|
106675
107301
|
{ wch: 20 } // brand
|
|
106676
107302
|
];
|
|
106677
|
-
|
|
107303
|
+
xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.book_append_sheet(wb, ws, "Products");
|
|
106678
107304
|
// Generate buffer
|
|
106679
|
-
const wbout =
|
|
107305
|
+
const wbout = xlsx__WEBPACK_IMPORTED_MODULE_66__.write(wb, { bookType: 'xlsx', type: 'array' });
|
|
106680
107306
|
// Upload to Drive (имя файла по бренду)
|
|
106681
107307
|
const dateStr = new Date().toISOString().split('T')[0];
|
|
106682
107308
|
const fileName = `${brand}-${dateStr}.xlsx`;
|
|
@@ -106806,13 +107432,13 @@ ${imageData.originalPrompt}
|
|
|
106806
107432
|
setTestLoading(true);
|
|
106807
107433
|
try {
|
|
106808
107434
|
// Create simple test workbook with structure
|
|
106809
|
-
const wb =
|
|
107435
|
+
const wb = xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.book_new();
|
|
106810
107436
|
const rows = [
|
|
106811
107437
|
INSTRUCTION_ROW,
|
|
106812
107438
|
['id', 'title', 'description', 'availability', 'condition', 'price', 'link', 'image_link', 'brand'],
|
|
106813
107439
|
['test1', 'Test Title', 'Test Description', 'in stock', 'new', testPrice, 'http://test.com', 'http://test.com/img.jpg', 'TestBrand']
|
|
106814
107440
|
];
|
|
106815
|
-
const ws =
|
|
107441
|
+
const ws = xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.aoa_to_sheet(rows);
|
|
106816
107442
|
// Set column widths
|
|
106817
107443
|
ws['!cols'] = [
|
|
106818
107444
|
{ wch: 20 }, // id
|
|
@@ -106825,8 +107451,8 @@ ${imageData.originalPrompt}
|
|
|
106825
107451
|
{ wch: 40 }, // image_link
|
|
106826
107452
|
{ wch: 20 } // brand
|
|
106827
107453
|
];
|
|
106828
|
-
|
|
106829
|
-
const wbout =
|
|
107454
|
+
xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.book_append_sheet(wb, ws, "Test");
|
|
107455
|
+
const wbout = xlsx__WEBPACK_IMPORTED_MODULE_66__.write(wb, { bookType: 'xlsx', type: 'array' });
|
|
106830
107456
|
// Try to extract folder ID if available, otherwise upload to root
|
|
106831
107457
|
const folderId = driveFolderUrl ? extractFolderId(driveFolderUrl) : undefined;
|
|
106832
107458
|
const result = await uploadFileToDrive(wbout, 'test_table.xlsx', folderId || undefined);
|
|
@@ -106876,9 +107502,179 @@ ${imageData.originalPrompt}
|
|
|
106876
107502
|
alert('Не удалось скопировать в буфер обмена');
|
|
106877
107503
|
}
|
|
106878
107504
|
};
|
|
107505
|
+
const syncUIFromImportedLocalStorage = (m) => {
|
|
107506
|
+
const g = (k) => m[k];
|
|
107507
|
+
const t = g('themeMode');
|
|
107508
|
+
if (t === 'dark' || t === 'light') {
|
|
107509
|
+
const isDark = t === 'dark';
|
|
107510
|
+
setDarkMode(isDark);
|
|
107511
|
+
applyThemeStyles(isDark);
|
|
107512
|
+
}
|
|
107513
|
+
if (g('selectedImageModelSquare'))
|
|
107514
|
+
setSelectedImageModelSquare(g('selectedImageModelSquare'));
|
|
107515
|
+
if (g('selectedImageModelRect'))
|
|
107516
|
+
setSelectedImageModelRect(g('selectedImageModelRect'));
|
|
107517
|
+
if (g('selectedValidationModel'))
|
|
107518
|
+
setSelectedValidationModel(g('selectedValidationModel'));
|
|
107519
|
+
if (g('selectedContentModel'))
|
|
107520
|
+
setSelectedContentModel(g('selectedContentModel'));
|
|
107521
|
+
if (g('selectedLandingModel'))
|
|
107522
|
+
setSelectedLandingModel(g('selectedLandingModel'));
|
|
107523
|
+
if (g('validationDisabled') !== undefined)
|
|
107524
|
+
setValidationDisabled(g('validationDisabled') === 'true');
|
|
107525
|
+
if (g('autoRemakeOnValidatorError') !== undefined) {
|
|
107526
|
+
setAutoRemakeOnValidatorError(g('autoRemakeOnValidatorError') === 'true');
|
|
107527
|
+
}
|
|
107528
|
+
if (g('uploadAfterValidatorOk') !== undefined) {
|
|
107529
|
+
setUploadAfterValidatorOk(g('uploadAfterValidatorOk') === 'true');
|
|
107530
|
+
}
|
|
107531
|
+
const ar = g('imageAspectRatio');
|
|
107532
|
+
if (ar === '1:1' || ar === '2:3' || ar === 'both')
|
|
107533
|
+
setImageAspectRatio(ar);
|
|
107534
|
+
else if (ar === '4:5' || ar === '9:16')
|
|
107535
|
+
setImageAspectRatio('2:3');
|
|
107536
|
+
if (g('cached_driveFolderUrl') !== undefined)
|
|
107537
|
+
setDriveFolderUrl(g('cached_driveFolderUrl'));
|
|
107538
|
+
if (g('cached_rootDriveFolderUrl') !== undefined)
|
|
107539
|
+
setRootDriveFolderUrl(g('cached_rootDriveFolderUrl'));
|
|
107540
|
+
};
|
|
107541
|
+
const handleSettingsExport = async () => {
|
|
107542
|
+
try {
|
|
107543
|
+
const api = getElectronAPI();
|
|
107544
|
+
let el = null;
|
|
107545
|
+
if (api?.loadConfig) {
|
|
107546
|
+
try {
|
|
107547
|
+
el = (await api.loadConfig());
|
|
107548
|
+
}
|
|
107549
|
+
catch {
|
|
107550
|
+
el = null;
|
|
107551
|
+
}
|
|
107552
|
+
}
|
|
107553
|
+
const bundle = (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.buildSettingsBundle)(settingsExportFlags, el);
|
|
107554
|
+
const json = (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.serializeBundle)(bundle);
|
|
107555
|
+
if (api?.saveFile) {
|
|
107556
|
+
const ok = await api.saveFile(json, 'docs-combiner-settings.json');
|
|
107557
|
+
if (!ok) {
|
|
107558
|
+
setSettingsBackupSnackbar({ open: true, message: 'Сохранение отменено', severity: 'error' });
|
|
107559
|
+
return;
|
|
107560
|
+
}
|
|
107561
|
+
}
|
|
107562
|
+
else {
|
|
107563
|
+
const blob = new Blob([json], { type: 'application/json' });
|
|
107564
|
+
const a = document.createElement('a');
|
|
107565
|
+
const url = URL.createObjectURL(blob);
|
|
107566
|
+
a.href = url;
|
|
107567
|
+
a.download = 'docs-combiner-settings.json';
|
|
107568
|
+
a.click();
|
|
107569
|
+
URL.revokeObjectURL(url);
|
|
107570
|
+
}
|
|
107571
|
+
setSettingsBackupSnackbar({ open: true, message: 'Настройки экспортированы в JSON', severity: 'success' });
|
|
107572
|
+
}
|
|
107573
|
+
catch (e) {
|
|
107574
|
+
setSettingsBackupSnackbar({
|
|
107575
|
+
open: true,
|
|
107576
|
+
message: e?.message || String(e),
|
|
107577
|
+
severity: 'error',
|
|
107578
|
+
});
|
|
107579
|
+
}
|
|
107580
|
+
};
|
|
107581
|
+
const handleSettingsImportFileChange = (e) => {
|
|
107582
|
+
const file = e.target.files?.[0];
|
|
107583
|
+
e.target.value = '';
|
|
107584
|
+
if (!file)
|
|
107585
|
+
return;
|
|
107586
|
+
const reader = new FileReader();
|
|
107587
|
+
reader.onload = () => {
|
|
107588
|
+
try {
|
|
107589
|
+
const text = String(reader.result || '');
|
|
107590
|
+
const bundle = (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.parseSettingsBundleJson)(text);
|
|
107591
|
+
setSettingsImportBundle(bundle);
|
|
107592
|
+
const present = (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.getPresentSections)(bundle);
|
|
107593
|
+
setSettingsImportFlags({
|
|
107594
|
+
promptOverrides: present.promptOverrides,
|
|
107595
|
+
localStorage: present.localStorage,
|
|
107596
|
+
electronConfig: present.electronConfig,
|
|
107597
|
+
});
|
|
107598
|
+
}
|
|
107599
|
+
catch (err) {
|
|
107600
|
+
setSettingsBackupSnackbar({
|
|
107601
|
+
open: true,
|
|
107602
|
+
message: err?.message || String(err),
|
|
107603
|
+
severity: 'error',
|
|
107604
|
+
});
|
|
107605
|
+
setSettingsImportBundle(null);
|
|
107606
|
+
setSettingsImportFlags(null);
|
|
107607
|
+
}
|
|
107608
|
+
};
|
|
107609
|
+
reader.onerror = () => {
|
|
107610
|
+
setSettingsBackupSnackbar({ open: true, message: 'Не удалось прочитать файл', severity: 'error' });
|
|
107611
|
+
};
|
|
107612
|
+
reader.readAsText(file);
|
|
107613
|
+
};
|
|
107614
|
+
const handleSettingsImportApply = async () => {
|
|
107615
|
+
if (!settingsImportBundle || !settingsImportFlags)
|
|
107616
|
+
return;
|
|
107617
|
+
const b = settingsImportBundle;
|
|
107618
|
+
const f = settingsImportFlags;
|
|
107619
|
+
let electronConfigSkipped = false;
|
|
107620
|
+
try {
|
|
107621
|
+
if (f.localStorage && b.localStorage && Object.keys(b.localStorage).length) {
|
|
107622
|
+
(0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.applyLocalStorageFromBundle)(b, true);
|
|
107623
|
+
syncUIFromImportedLocalStorage(b.localStorage);
|
|
107624
|
+
}
|
|
107625
|
+
if (f.promptOverrides) {
|
|
107626
|
+
(0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.applyPromptOverridesFromBundle)(b, true);
|
|
107627
|
+
}
|
|
107628
|
+
if (f.electronConfig && b.electronConfig && Object.keys(b.electronConfig).length) {
|
|
107629
|
+
const api = getElectronAPI();
|
|
107630
|
+
if (api?.loadConfig && api?.saveConfig) {
|
|
107631
|
+
const cur = (await api.loadConfig());
|
|
107632
|
+
const next = (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.mergeElectronImport)(cur, b, true);
|
|
107633
|
+
await api.saveConfig(next);
|
|
107634
|
+
const ec = b.electronConfig;
|
|
107635
|
+
if (ec.clientId !== undefined)
|
|
107636
|
+
setClientId(String(ec.clientId));
|
|
107637
|
+
if (ec.clientSecret !== undefined)
|
|
107638
|
+
setClientSecret(String(ec.clientSecret));
|
|
107639
|
+
if (ec.openaiApiKey !== undefined)
|
|
107640
|
+
setOpenaiApiKey(String(ec.openaiApiKey));
|
|
107641
|
+
if (ec.flexcardApiKey !== undefined)
|
|
107642
|
+
setFlexcardApiKey(String(ec.flexcardApiKey));
|
|
107643
|
+
if (ec.telegramBotToken !== undefined)
|
|
107644
|
+
setTelegramBotToken(String(ec.telegramBotToken));
|
|
107645
|
+
if (ec.telegramChatId !== undefined)
|
|
107646
|
+
setTelegramChatId(String(ec.telegramChatId));
|
|
107647
|
+
if (ec.accessToken !== undefined)
|
|
107648
|
+
setAccessToken(String(ec.accessToken));
|
|
107649
|
+
if (ec.refreshToken !== undefined)
|
|
107650
|
+
setRefreshToken(String(ec.refreshToken));
|
|
107651
|
+
}
|
|
107652
|
+
else {
|
|
107653
|
+
electronConfigSkipped = true;
|
|
107654
|
+
}
|
|
107655
|
+
}
|
|
107656
|
+
setSettingsImportBundle(null);
|
|
107657
|
+
setSettingsImportFlags(null);
|
|
107658
|
+
setSettingsBackupDialogOpen(false);
|
|
107659
|
+
setSettingsBackupSnackbar({
|
|
107660
|
+
open: true,
|
|
107661
|
+
message: electronConfigSkipped
|
|
107662
|
+
? 'Импорт применён. Блок OAuth / ключ OpenRouter / токены Google: только в десктопе (Electron).'
|
|
107663
|
+
: 'Импорт настроек применён',
|
|
107664
|
+
severity: 'success',
|
|
107665
|
+
});
|
|
107666
|
+
}
|
|
107667
|
+
catch (e) {
|
|
107668
|
+
setSettingsBackupSnackbar({
|
|
107669
|
+
open: true,
|
|
107670
|
+
message: e?.message || String(e),
|
|
107671
|
+
severity: 'error',
|
|
107672
|
+
});
|
|
107673
|
+
}
|
|
107674
|
+
};
|
|
106879
107675
|
// Show lock screen if not unlocked
|
|
106880
107676
|
if (!unlocked) {
|
|
106881
|
-
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107677
|
+
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_40__["default"], { theme: theme },
|
|
106882
107678
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], null),
|
|
106883
107679
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { onClick: handleSecretClick, sx: {
|
|
106884
107680
|
width: '100vw',
|
|
@@ -106918,81 +107714,108 @@ ${imageData.originalPrompt}
|
|
|
106918
107714
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("br", null),
|
|
106919
107715
|
"Please contact system administrator"))));
|
|
106920
107716
|
}
|
|
106921
|
-
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107717
|
+
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_40__["default"], { theme: theme },
|
|
106922
107718
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], null),
|
|
106923
107719
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { maxWidth: "lg", sx: { py: 4 } },
|
|
106924
107720
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 2 } },
|
|
106925
107721
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h4", component: "h1", sx: { fontWeight: 'bold', color: 'primary.main' } }, "Docs Combiner"),
|
|
106926
107722
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
|
|
106927
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
|
106928
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106929
|
-
|
|
106930
|
-
|
|
106931
|
-
|
|
106932
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107723
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0420\u0435\u0437\u0435\u0440\u0432\u043D\u0430\u044F \u043A\u043E\u043F\u0438\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A (\u044D\u043A\u0441\u043F\u043E\u0440\u0442 / \u0438\u043C\u043F\u043E\u0440\u0442)" },
|
|
107724
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { onClick: () => setSettingsBackupDialogOpen(true), color: "inherit", "aria-label": "\u0440\u0435\u0437\u0435\u0440\u0432\u043D\u0430\u044F \u043A\u043E\u043F\u0438\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A", sx: { mr: 1 } },
|
|
107725
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_44__["default"], null))),
|
|
107726
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { onClick: () => setPromptManagerOpen(true), color: "inherit", "aria-label": "manage prompts", sx: { mr: 1 } },
|
|
107727
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_60__["default"], null)),
|
|
107728
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { onClick: toggleTheme, color: "inherit", "aria-label": "toggle theme" }, darkMode ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_46__["default"], null) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_45__["default"], null)))),
|
|
107729
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "file", ref: settingsImportFileInputRef, style: { display: 'none' }, accept: "application/json,.json", onChange: handleSettingsImportFileChange }),
|
|
107730
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { variant: "outlined", sx: { mb: 4 } },
|
|
107731
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], null,
|
|
107732
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 3 },
|
|
106933
107733
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
|
|
106934
107734
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h6", gutterBottom: true }, "Google Drive Authentication"),
|
|
106935
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106936
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106937
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107735
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__["default"], { defaultExpanded: false },
|
|
107736
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["default"], { expandIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_53__["default"], null) }, accessToken ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { sx: { display: 'flex', alignItems: 'center', color: 'success.main' } },
|
|
107737
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_47__["default"], { sx: { mr: 1 } }),
|
|
106938
107738
|
" Logged In (Credentials Hidden)")) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { color: "text.secondary" }, "Credentials"))),
|
|
106939
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106940
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107739
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], null,
|
|
107740
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 2 },
|
|
106941
107741
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
|
|
106942
107742
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle2", color: "text.secondary", gutterBottom: true }, "\u041A\u043E\u0440\u043D\u0435\u0432\u0430\u044F \u043F\u0430\u043F\u043A\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u0430"),
|
|
106943
107743
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", sx: { mb: 1 } }, "\u0421\u0441\u044B\u043B\u043A\u0430 \u043D\u0430 \u043A\u043E\u0440\u043D\u0435\u0432\u0443\u044E \u043F\u0430\u043F\u043A\u0443 \u043D\u0430 Google \u0414\u0438\u0441\u043A\u0435 (\u0432\u043D\u0443\u0442\u0440\u0438 \u043D\u0435\u0451 \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u043F\u0430\u043F\u043A\u0430 OFFERS)."),
|
|
106944
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106945
|
-
checkingRootFolder && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107744
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "URL \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u043F\u0430\u043F\u043A\u0438 Google Drive", variant: "outlined", fullWidth: true, value: rootDriveFolderUrl, onChange: (e) => setRootDriveFolderUrl(e.target.value), placeholder: "https://drive.google.com/drive/folders/...", sx: { mb: 1 } }),
|
|
107745
|
+
checkingRootFolder && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null,
|
|
106946
107746
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { component: "span", sx: { display: 'inline-flex', alignItems: 'center', gap: 1 } },
|
|
106947
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107747
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 14 }),
|
|
106948
107748
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u043F\u0430\u043F\u043A\u0438 (OFFERS, \u0434\u043E\u0441\u0442\u0443\u043F)...")))),
|
|
106949
|
-
drivePublicAccessWarning && extractFolderId(rootDriveFolderUrl) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106950
|
-
!checkingRootFolder && rootFolderInfo && !rootFolderInfo.hasOffersFolder && extractFolderId(rootDriveFolderUrl) && (accessToken || refreshToken) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106951
|
-
!checkingRootFolder && !rootFolderInfo && rootDriveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107749
|
+
drivePublicAccessWarning && extractFolderId(rootDriveFolderUrl) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "warning", sx: { mt: 1 } }, "\u041E\u0431\u0449\u0438\u0439 \u0434\u043E\u0441\u0442\u0443\u043F \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0432\u043A\u043B\u044E\u0447\u0451\u043D. \u0417\u0430\u043A\u0440\u043E\u0439\u0442\u0435 \u0435\u0433\u043E \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0432 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 Google \u0414\u0438\u0441\u043A\u0430 \u0438\u043B\u0438 \u0441\u043C\u0435\u043D\u0438\u0442\u0435 \u043F\u0430\u043F\u043A\u0443 \u0438 \u0441\u043E\u0433\u043B\u0430\u0441\u0438\u0442\u0435\u0441\u044C \u0443\u0431\u0440\u0430\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.")),
|
|
107750
|
+
!checkingRootFolder && rootFolderInfo && !rootFolderInfo.hasOffersFolder && extractFolderId(rootDriveFolderUrl) && (accessToken || refreshToken) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0412 \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u043F\u0430\u043F\u043A\u0435 \u043D\u0435\u0442 \u043F\u043E\u0434\u043F\u0430\u043F\u043A\u0438 OFFERS. \u0421\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u043F\u0430\u043F\u043A\u0443 \u0441 \u0438\u043C\u0435\u043D\u0435\u043C OFFERS (\u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043D\u0435 \u0432\u0430\u0436\u0435\u043D) \u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443.")),
|
|
107751
|
+
!checkingRootFolder && !rootFolderInfo && rootDriveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, (accessToken || refreshToken)
|
|
106952
107752
|
? 'Введите корректную ссылку на корневую папку Google Drive'
|
|
106953
107753
|
: 'Войдите в Google, чтобы проверить корневую папку и подпапку OFFERS'))),
|
|
106954
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106955
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106956
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106957
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106958
|
-
|
|
106959
|
-
|
|
106960
|
-
|
|
106961
|
-
|
|
106962
|
-
|
|
106963
|
-
|
|
106964
|
-
|
|
106965
|
-
|
|
106966
|
-
|
|
106967
|
-
|
|
106968
|
-
|
|
107754
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Client ID", variant: "outlined", fullWidth: true, value: clientId, onChange: (e) => handleClientIdChange(e.target.value), helperText: "From Google Cloud Console (OAuth 2.0 Client ID)" }),
|
|
107755
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Client Secret", variant: "outlined", fullWidth: true, value: clientSecret, onChange: (e) => handleClientSecretChange(e.target.value) }),
|
|
107756
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], null),
|
|
107757
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "OpenRouter API Key", variant: "outlined", fullWidth: true, value: openaiApiKey, onChange: (e) => handleOpenaiApiKeyChange(e.target.value), helperText: "Required for AI generation (images and text). Your key is stored locally. Get your key at openrouter.ai" }),
|
|
107758
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "FlexCard API Key", variant: "outlined", fullWidth: true, value: flexcardApiKey, onChange: (e) => handleFlexcardApiKeyChange(e.target.value), helperText: "\u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E: \u0431\u0430\u043B\u0430\u043D\u0441 \u043A\u043E\u0448\u0435\u043B\u044C\u043A\u043E\u0432 \u043D\u0430 flexcard.cards (\u0440\u0430\u0437\u0434\u0435\u043B Team \u2192 API). \u041A\u043B\u044E\u0447 \u0445\u0440\u0430\u043D\u0438\u0442\u0441\u044F \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u0432 config.", InputProps: {
|
|
107759
|
+
endAdornment: (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { position: "end" },
|
|
107760
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043E\u0431\u043C\u0435\u043D\u0430" },
|
|
107761
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { edge: "end", "aria-label": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u043B\u044E\u0447 FlexCard \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430", onClick: () => void handlePasteFlexcardApiKey() },
|
|
107762
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_51__["default"], null))))),
|
|
107763
|
+
} }),
|
|
107764
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, alignItems: "center", sx: { flexWrap: 'nowrap', gap: 1 } },
|
|
107765
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Telegram bot token", size: "small", fullWidth: true, sx: { flex: 2, minWidth: 0 }, value: telegramBotToken, onChange: (e) => handleTelegramBotTokenChange(e.target.value), placeholder: "123456789:ABC...", autoComplete: "off" }),
|
|
107766
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Chat ID", size: "small", sx: { flex: 1, minWidth: 72, maxWidth: 200 }, value: telegramChatId, onChange: (e) => handleTelegramChatIdChange(e.target.value), placeholder: "-100\u2026", autoComplete: "off" }),
|
|
107767
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", size: "small", disabled: telegramTestSending || !telegramBotToken.trim() || !telegramChatId.trim(), onClick: () => void handleTelegramTestSend(), sx: { flexShrink: 0, whiteSpace: 'nowrap', minWidth: 'auto' } }, telegramTestSending ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 18, color: "inherit" })) : ('Тест'))),
|
|
107768
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { sx: { mt: 0 } }, "Telegram \u2014 \u0434\u043B\u044F \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043E\u043F\u043E\u0432\u0435\u0449\u0435\u043D\u0438\u0439; \u0442\u0435\u0441\u0442 \u0448\u043B\u0451\u0442 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0438\u0437 Electron (\u043E\u0431\u0445\u043E\u0434 CORS).")))),
|
|
107769
|
+
(openaiApiKey || flexcardApiKey.trim()) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 2, mt: 2, flexWrap: 'wrap' } },
|
|
107770
|
+
openaiApiKey && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
107771
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_41__["default"], { color: openRouterAccountBalance !== null ? 'primary' : 'disabled' }),
|
|
107772
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: openRouterAccountBalance !== null ? 'text.primary' : 'text.secondary' },
|
|
107773
|
+
"OpenRouter \u2014 \u0431\u0430\u043B\u0430\u043D\u0441: ",
|
|
107774
|
+
openRouterBalanceLoading ? '…' : (openRouterAccountBalance !== null ? `$${openRouterAccountBalance.toFixed(2)}` : 'N/A')),
|
|
107775
|
+
(openRouterBalanceLoading || openRouterBalance !== -1) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
107776
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u2022"),
|
|
107777
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: openRouterBalance !== null ? 'text.primary' : 'text.secondary' },
|
|
107778
|
+
"\u043B\u0438\u043C\u0438\u0442 \u043A\u043B\u044E\u0447\u0430:",
|
|
107779
|
+
' ',
|
|
107780
|
+
openRouterBalanceLoading ? '…' : openRouterBalance === null ? 'N/A' : `${openRouterBalance.toFixed(4)}`))))),
|
|
107781
|
+
openaiApiKey && flexcardApiKey.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u2022")),
|
|
107782
|
+
flexcardApiKey.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { component: "span", variant: "body2", color: flexCardUsdTotal !== null ? 'text.primary' : 'text.secondary' },
|
|
107783
|
+
"flexcard",
|
|
107784
|
+
' ',
|
|
107785
|
+
flexCardBalanceLoading
|
|
107786
|
+
? '…'
|
|
107787
|
+
: flexCardUsdTotal === null
|
|
107788
|
+
? 'N/A'
|
|
107789
|
+
: `$${flexCardUsdTotal.toFixed(2)}`)))),
|
|
107790
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mt: 2 }, flexWrap: "wrap", useFlexGap: true },
|
|
107791
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: accessToken ? "success" : "primary", onClick: handleLogin, disabled: authLoading || !clientId || !clientSecret, startIcon: authLoading ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20, color: "inherit" }) : (accessToken ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_47__["default"], null) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_55__["default"], null)), sx: { flexGrow: 1, minWidth: 200 } }, authLoading ? 'Logging in...' : (accessToken ? 'Logged In' : 'Login with Google')),
|
|
106969
107792
|
authLoading && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
106970
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106971
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106972
|
-
accessToken && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106973
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107793
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", color: "primary", onClick: () => void handleReopenAuthBrowser(), startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_58__["default"], null) }, "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0432\u0445\u043E\u0434\u0430 \u0441\u043D\u043E\u0432\u0430"),
|
|
107794
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", color: "inherit", onClick: () => void handleCancelPendingAuth(), startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_48__["default"], null) }, "\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0445\u043E\u0434"))),
|
|
107795
|
+
accessToken && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", color: "error", onClick: handleLogout, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_56__["default"], null) }, "Logout")))),
|
|
107796
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { sx: { my: 2 } }),
|
|
106974
107797
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
|
|
106975
107798
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h6", gutterBottom: true }, "Google Drive Folder"),
|
|
106976
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107799
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
|
|
106977
107800
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { flexGrow: 1 } },
|
|
106978
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107801
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Google Drive Folder URL", variant: "outlined", fullWidth: true, value: driveFolderUrl, onChange: (e) => setDriveFolderUrl(e.target.value), placeholder: "https://drive.google.com/drive/folders/...", InputProps: {
|
|
106979
107802
|
endAdornment: (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { position: "end" },
|
|
106980
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106981
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
106982
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107803
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043E\u0431\u043C\u0435\u043D\u0430" },
|
|
107804
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { edge: "end", "aria-label": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u043F\u0430\u043F\u043A\u0443 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430", onClick: () => void handlePasteDriveFolderUrl() },
|
|
107805
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_51__["default"], null)))))
|
|
106983
107806
|
} }),
|
|
106984
|
-
checkingFolderFiles && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107807
|
+
checkingFolderFiles && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null,
|
|
106985
107808
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { component: "span", sx: { display: 'inline-flex', alignItems: 'center', gap: 1 } },
|
|
106986
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107809
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 14 }),
|
|
106987
107810
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0444\u0430\u0439\u043B\u043E\u0432 \u0432 \u043F\u0430\u043F\u043A\u0435...")))),
|
|
106988
|
-
!checkingFolderFiles && folderFilesInfo && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107811
|
+
!checkingFolderFiles && folderFilesInfo && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null,
|
|
106989
107812
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { component: "span", sx: { display: 'block' } }, folderFilesInfo.hasProduct ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { component: "span", sx: { color: 'success.main' } }, "\u2713 product.png/jpg/webp \u043D\u0430\u0439\u0434\u0435\u043D")) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { component: "span", sx: { color: 'info.main' } }, "\u2139 product.png/jpg/webp \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D \u2014 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u043A\u043D\u043E\u043F\u043A\u0443 \u043D\u0438\u0436\u0435"))))),
|
|
106990
|
-
!checkingFolderFiles && !folderFilesInfo && driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107813
|
+
!checkingFolderFiles && !folderFilesInfo && driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, (accessToken || refreshToken)
|
|
106991
107814
|
? 'Введите корректную ссылку на папку Google Drive'
|
|
106992
107815
|
: 'Войдите в Google, чтобы проверить файлы в папке'))))),
|
|
106993
|
-
!driveFolderUrl.trim() ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107816
|
+
!driveFolderUrl.trim() ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "info", sx: { mt: 2 } },
|
|
106994
107817
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body1", sx: { fontWeight: 'bold', mb: 1 } }, "\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u043F\u0430\u043F\u043A\u0443 Google Drive \u0434\u043B\u044F \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u044F"),
|
|
106995
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u0414\u043B\u044F \u0440\u0430\u0431\u043E\u0442\u044B \u0441 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 \u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0443 Google Drive."))) : !extractFolderId(driveFolderUrl) ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107818
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u0414\u043B\u044F \u0440\u0430\u0431\u043E\u0442\u044B \u0441 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 \u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0443 Google Drive."))) : !extractFolderId(driveFolderUrl) ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "warning", sx: { mt: 2 } },
|
|
106996
107819
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body1", sx: { fontWeight: 'bold', mb: 1 } }, "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u0443\u044E \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u043F\u0430\u043F\u043A\u0443"),
|
|
106997
107820
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u0421\u0441\u044B\u043B\u043A\u0430 \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435: https://drive.google.com/drive/folders/..."))) : loadingContentFromDrive ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
|
|
106998
107821
|
display: 'flex',
|
|
@@ -107008,132 +107831,136 @@ ${imageData.originalPrompt}
|
|
|
107008
107831
|
? 'rgba(25, 118, 210, 0.1)'
|
|
107009
107832
|
: 'rgba(25, 118, 210, 0.05)'
|
|
107010
107833
|
} },
|
|
107011
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107834
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 40, sx: { color: 'primary.main' } }),
|
|
107012
107835
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body1", sx: { color: 'text.secondary', fontWeight: 'bold' } }, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0434\u0430\u043D\u043D\u044B\u0445 \u0438\u0437 \u043F\u0430\u043F\u043A\u0438..."))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
107013
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107014
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107836
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
|
|
107837
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Brand (Short ID)", variant: "outlined", sx: { flex: '0 0 320px', minWidth: 280 }, value: brand, InputProps: { readOnly: true }, placeholder: "\u0410\u0432\u0442\u043E: \u0442\u043E\u0432\u0430\u0440-\u0433\u0435\u043E-\u0446\u0435\u043D\u0430", helperText: "\u0410\u0432\u0442\u043E\u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0438\u0437 \u0442\u043E\u0432\u0430\u0440\u0430, \u0433\u0435\u043E \u0438 \u0446\u0435\u043D\u044B" }),
|
|
107015
107838
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { flex: 1, minWidth: 0 } },
|
|
107016
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107839
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Link", variant: "outlined", fullWidth: true, value: link, onChange: (e) => handleLinkChange(e.target.value), onBlur: handleLinkBlur, error: !!linkError, helperText: linkError, placeholder: "https://example.com/product/", inputRef: linkInputRef, InputProps: {
|
|
107017
107840
|
onPaste: handleLinkPaste,
|
|
107018
107841
|
endAdornment: (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { position: "end" },
|
|
107019
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107020
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107021
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107842
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043E\u0431\u043C\u0435\u043D\u0430" },
|
|
107843
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { edge: "end", "aria-label": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u0442\u043E\u0432\u0430\u0440 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430", onClick: () => void handlePasteProductLink() },
|
|
107844
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_51__["default"], null)))))
|
|
107022
107845
|
} }))),
|
|
107023
107846
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', gap: 1, alignItems: 'flex-start', mt: 1.5 } },
|
|
107024
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107025
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107026
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107027
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107028
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107029
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107847
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u0414\u043E\u043F. \u043C\u0430\u043A\u0440\u043E\u0441\u044B (\u043A\u0430\u0442\u0430\u043B\u043E\u0433)", variant: "outlined", size: "small", fullWidth: true, multiline: true, minRows: 2, value: catalogLinkExtraMacros, onChange: (e) => setCatalogLinkExtraMacros(e.target.value), placeholder: DEFAULT_CATALOG_LINK_EXTRA_MACROS, helperText: "\u0414\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 creative_id \u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432 (sub18, sub19, sub20 \u043F\u0440\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438). \u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u0432 JSON \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u043F\u0430\u043F\u043A\u0438.", sx: { '& .MuiInputBase-input': { fontFamily: 'monospace', fontSize: 12 } } }),
|
|
107848
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 0.5, sx: { flexShrink: 0, mt: 0.5 } },
|
|
107849
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", onClick: () => setCatalogLinkExtraMacros(DEFAULT_CATALOG_LINK_EXTRA_MACROS), sx: { textTransform: 'none', whiteSpace: 'nowrap' } }, "redtrack"),
|
|
107850
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", onClick: () => setCatalogLinkExtraMacros(DEFAULT_CATALOG_LINK_KEITARO_MACROS), sx: { textTransform: 'none', whiteSpace: 'nowrap' } }, "keitaro"))),
|
|
107851
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 1.5, sx: { mt: 1 } },
|
|
107852
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2, alignItems: { xs: 'stretch', sm: 'flex-start' } },
|
|
107030
107853
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: catalogUrlIncludeTextApproach, onChange: e => setCatalogUrlIncludeTextApproach(e.target.checked), size: "small" }), label: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
|
|
107031
107854
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u041F\u043E\u0434\u0445\u043E\u0434 \u043A \u0442\u0435\u043A\u0441\u0442\u0443 \u0432 URL \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430"),
|
|
107032
107855
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary" }, "\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u2014 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E\u0434\u0445\u043E\u0434\u0430 \u0434\u043B\u044F \u043F\u0430\u0440 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A (1\u201310)")), sx: { alignItems: 'flex-start', mr: 0, flex: { sm: '1 1 200px' }, minWidth: 0 } }),
|
|
107033
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107034
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107856
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430", size: "small", value: catalogUrlTextApproachParam, onChange: e => setCatalogUrlTextApproachParam(e.target.value), placeholder: DEFAULT_CATALOG_TEXT_APPROACH_PARAM, sx: { width: { xs: '100%', sm: 200 }, flexShrink: 0 }, helperText: `По умолчанию: ${DEFAULT_CATALOG_TEXT_APPROACH_PARAM}` })),
|
|
107857
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2, alignItems: { xs: 'stretch', sm: 'flex-start' } },
|
|
107035
107858
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: catalogUrlIncludeCreoApproach, onChange: e => setCatalogUrlIncludeCreoApproach(e.target.checked), size: "small" }), label: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
|
|
107036
107859
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u041F\u043E\u0434\u0445\u043E\u0434 \u043A \u043A\u0440\u0435\u043E \u0432 URL \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430"),
|
|
107037
107860
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary" }, "\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u2014 \u043D\u043E\u043C\u0435\u0440 N \u0438\u0437 \u0438\u043C\u0435\u043D\u0438 N_xxxxxxxx_11|23.png \u043D\u0430 Drive (N = \u0441\u0442\u0440\u043E\u043A\u0430 \u043F\u043E\u0434\u0445\u043E\u0434\u0430 \u043A \u043A\u0440\u0435\u043E, 1\u201310); \u00AB (1)\u00BB \u043E\u0442 \u0434\u0443\u0431\u043B\u0438\u043A\u0430\u0442\u0430 Google \u0441\u043D\u0438\u043C\u0430\u0435\u0442\u0441\u044F")), sx: { alignItems: 'flex-start', mr: 0, flex: { sm: '1 1 200px' }, minWidth: 0 } }),
|
|
107038
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107039
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107861
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0434\u043B\u044F \u043A\u0440\u0435\u043E", size: "small", value: catalogUrlCreoApproachParam, onChange: e => setCatalogUrlCreoApproachParam(e.target.value), placeholder: DEFAULT_CATALOG_CREO_APPROACH_PARAM, sx: { width: { xs: '100%', sm: 200 }, flexShrink: 0 }, helperText: `По умолчанию: ${DEFAULT_CATALOG_CREO_APPROACH_PARAM}` })),
|
|
107862
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2, alignItems: { xs: 'stretch', sm: 'flex-start' } },
|
|
107040
107863
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: catalogUrlIncludeImageAspect, onChange: e => setCatalogUrlIncludeImageAspect(e.target.checked), size: "small" }), label: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
|
|
107041
107864
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u0422\u0438\u043F \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0432 URL \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430"),
|
|
107042
107865
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary" }, "\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u044F 1_1 (1:1) \u0438 2_3 (2:3) \u2014 \u0438\u0437 \u0441\u0443\u0444\u0444\u0438\u043A\u0441\u0430 _11 / _23 \u0432 \u0438\u043C\u0435\u043D\u0438 \u0444\u0430\u0439\u043B\u0430 \u043D\u0430 Drive \u0438\u043B\u0438 \u0438\u0437 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0441\u043E\u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u044F, \u0435\u0441\u043B\u0438 \u0441\u0443\u0444\u0444\u0438\u043A\u0441\u0430 \u043D\u0435\u0442")), sx: { alignItems: 'flex-start', mr: 0, flex: { sm: '1 1 200px' }, minWidth: 0 } }),
|
|
107043
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107044
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107866
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0434\u043B\u044F \u0442\u0438\u043F\u0430 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", size: "small", value: catalogUrlImageAspectParam, onChange: e => setCatalogUrlImageAspectParam(e.target.value), placeholder: DEFAULT_CATALOG_IMAGE_ASPECT_PARAM, sx: { width: { xs: '100%', sm: 200 }, flexShrink: 0 }, helperText: `По умолчанию: ${DEFAULT_CATALOG_IMAGE_ASPECT_PARAM}` }))),
|
|
107867
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { sx: { my: 2 } }),
|
|
107045
107868
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h6", gutterBottom: true }, "AI Generation Settings"),
|
|
107046
107869
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
|
|
107047
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107048
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107049
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107050
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107870
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u0422\u043E\u0432\u0430\u0440", variant: "outlined", fullWidth: true, value: generateProduct, onChange: (e) => setGenerateProduct(e.target.value), placeholder: "\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: \u043A\u0430\u043F\u043B\u0438 \u043E\u0442 \u043F\u0430\u0440\u0430\u0437\u0438\u0442\u043E\u0432 Detoxil Water", sx: { mb: 2 } })),
|
|
107871
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
|
|
107872
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u0413\u0435\u043E", variant: "outlined", fullWidth: true, value: generateGeo, onChange: (e) => setGenerateGeo(e.target.value), placeholder: "\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: \u0420\u0443\u043C\u044B\u043D\u0438\u044F" }),
|
|
107873
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u0426\u0435\u043D\u0430 \u0438 \u0432\u0430\u043B\u044E\u0442\u0430", variant: "outlined", fullWidth: true, value: generatePriceWithCurrency, onChange: (e) => setGeneratePriceWithCurrency(e.target.value), placeholder: "\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: 29 euro, 11400 HUF, 149 RON \u0438\u043B\u0438 \u043B\u044E\u0431\u043E\u0439 \u0434\u0440\u0443\u0433\u043E\u0439 \u0444\u043E\u0440\u043C\u0430\u0442", helperText: "\u041B\u044E\u0431\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u043F\u0440\u043E\u043C\u043F\u0442\u0435 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439. \u041A\u043D\u043E\u043F\u043A\u0438 \u0441\u043F\u0440\u0430\u0432\u0430 \u043F\u043E\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0442 \u0441\u0438\u043C\u0432\u043E\u043B \u0432\u0430\u043B\u044E\u0442\u044B, \u0446\u0438\u0444\u0440\u0443 \u0431\u0435\u0440\u0443\u0442 \u0438\u0437 \u043F\u043E\u043B\u044F (\u0438\u043B\u0438 99).", InputProps: {
|
|
107051
107874
|
endAdornment: (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { position: "end" },
|
|
107052
107875
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 0.25, mr: -0.5 } },
|
|
107053
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107054
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107876
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u041F\u043E\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044C $ (\u0446\u0438\u0444\u0440\u0430 \u0438\u0437 \u043F\u043E\u043B\u044F \u0438\u043B\u0438 99)" },
|
|
107877
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0434\u043E\u043B\u043B\u0430\u0440", onClick: () => {
|
|
107055
107878
|
const n = extractLeadingPriceNumber(generatePriceWithCurrency);
|
|
107056
107879
|
setGeneratePriceWithCurrency(`$${n}`);
|
|
107057
107880
|
}, edge: "end" },
|
|
107058
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107059
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107060
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107881
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_42__["default"], { sx: { fontSize: 20 } }))),
|
|
107882
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u041F\u043E\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u20AC (\u0446\u0438\u0444\u0440\u0430 \u0438\u0437 \u043F\u043E\u043B\u044F \u0438\u043B\u0438 99)" },
|
|
107883
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0435\u0432\u0440\u043E", onClick: () => {
|
|
107061
107884
|
const n = extractLeadingPriceNumber(generatePriceWithCurrency);
|
|
107062
107885
|
setGeneratePriceWithCurrency(`€${n}`);
|
|
107063
107886
|
}, edge: "end", sx: { minWidth: 34, fontSize: '1rem', fontWeight: 700 } }, "\u20AC")),
|
|
107064
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107065
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107887
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u041F\u043E\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044C z\u0142 (\u0446\u0438\u0444\u0440\u0430 \u0438\u0437 \u043F\u043E\u043B\u044F \u0438\u043B\u0438 99)" },
|
|
107888
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0437\u043B\u043E\u0442\u044B\u0435", onClick: () => {
|
|
107066
107889
|
const n = extractLeadingPriceNumber(generatePriceWithCurrency);
|
|
107067
107890
|
setGeneratePriceWithCurrency(`${n} zł`);
|
|
107068
107891
|
}, edge: "end", sx: { minWidth: 36, fontSize: '0.8rem', fontWeight: 700, letterSpacing: -0.3 } }, "z\u0142"))))),
|
|
107069
107892
|
} })),
|
|
107070
107893
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
|
|
107071
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107894
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F (\u043D\u0435 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E)", variant: "outlined", fullWidth: true, multiline: true, minRows: 3, value: generateAdditionalInfo, onChange: (e) => setGenerateAdditionalInfo(e.target.value), placeholder: "\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B, \u0443\u0442\u043E\u0447\u043D\u0435\u043D\u0438\u044F \u043A \u043F\u0440\u043E\u043C\u043F\u0442\u0443 \u0438 \u0442.\u0434.", sx: { mb: 2 } })),
|
|
107072
107895
|
openaiApiKey && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
107073
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107896
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', md: 'row' }, spacing: 2, sx: { mb: 2, alignItems: 'stretch' } },
|
|
107074
107897
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], { fullWidth: true, variant: "outlined", sx: { flex: { md: '1 1 0' }, minWidth: { md: 0 } } },
|
|
107075
107898
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043E\u0432 (1:1)"),
|
|
107076
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: selectedImageModelSquare, onChange: (e) => handleImageModelSquareChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043E\u0432 (1:1)", disabled: loadingImageModels || imageModels.length === 0 }, loadingImageModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true },
|
|
107899
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: imageModels.some(m => m.id === selectedImageModelSquare) ? selectedImageModelSquare : '', onChange: (e) => handleImageModelSquareChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043E\u0432 (1:1)", disabled: loadingImageModels || imageModels.length === 0 }, loadingImageModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true },
|
|
107077
107900
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
|
|
107078
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107079
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : imageModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (imageModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
|
|
107080
|
-
!loadingImageModels && imageModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107901
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
|
|
107902
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : imageModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (imageModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
|
|
107903
|
+
!loadingImageModels && imageModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, selectedImageModelSquare === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.imageGeneration
|
|
107081
107904
|
? 'По умолчанию для квадрата'
|
|
107082
107905
|
: '1:1: ' +
|
|
107083
107906
|
(imageModels.find(m => m.id === selectedImageModelSquare)?.name ||
|
|
107084
107907
|
selectedImageModelSquare)))),
|
|
107085
107908
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], { fullWidth: true, variant: "outlined", sx: { flex: { md: '1 1 0' }, minWidth: { md: 0 } } },
|
|
107086
107909
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u0438\u043A\u043E\u0432 (2:3)"),
|
|
107087
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: selectedImageModelRect, onChange: (e) => handleImageModelRectChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u0438\u043A\u043E\u0432 (2:3)", disabled: loadingImageModels || imageModels.length === 0 }, loadingImageModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true },
|
|
107910
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: imageModels.some(m => m.id === selectedImageModelRect) ? selectedImageModelRect : '', onChange: (e) => handleImageModelRectChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u0438\u043A\u043E\u0432 (2:3)", disabled: loadingImageModels || imageModels.length === 0 }, loadingImageModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true },
|
|
107088
107911
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
|
|
107089
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107090
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : imageModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (imageModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
|
|
107091
|
-
!loadingImageModels && imageModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107912
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
|
|
107913
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : imageModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (imageModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
|
|
107914
|
+
!loadingImageModels && imageModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, selectedImageModelRect === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.imageGeneration
|
|
107092
107915
|
? 'По умолчанию для 2:3'
|
|
107093
107916
|
: '2:3: ' +
|
|
107094
107917
|
(imageModels.find(m => m.id === selectedImageModelRect)?.name ||
|
|
107095
107918
|
selectedImageModelRect)))),
|
|
107096
107919
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], { fullWidth: true, variant: "outlined", sx: { flex: { md: '1 1 0' }, minWidth: { md: 0 } } },
|
|
107097
107920
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043A\u0440\u0435\u0430\u0442\u0438\u0432\u043E\u0432"),
|
|
107098
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: selectedValidationModel, onChange: (e) => handleValidationModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043A\u0440\u0435\u0430\u0442\u0438\u0432\u043E\u0432", disabled: loadingValidationModels || validationModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true },
|
|
107921
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: validationModels.some(m => m.id === selectedValidationModel) ? selectedValidationModel : '', onChange: (e) => handleValidationModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043A\u0440\u0435\u0430\u0442\u0438\u0432\u043E\u0432", disabled: loadingValidationModels || validationModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true },
|
|
107099
107922
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
|
|
107100
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107101
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : validationModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (validationModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
|
|
107102
|
-
!loadingValidationModels && validationModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107923
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
|
|
107924
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : validationModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (validationModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
|
|
107925
|
+
!loadingValidationModels && validationModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, selectedValidationModel === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.creativeValidation
|
|
107103
107926
|
? 'Используется модель по умолчанию'
|
|
107104
107927
|
: 'Выбрана модель: ' + (validationModels.find(m => m.id === selectedValidationModel)?.name || selectedValidationModel))),
|
|
107105
107928
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: validationDisabled, onChange: (e) => handleValidationDisabledChange(e.target.checked), color: "primary" }), label: "\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443", sx: { mt: 1 } }),
|
|
107106
107929
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: autoRemakeOnValidatorError, onChange: (e) => handleAutoRemakeOnValidatorErrorChange(e.target.checked), color: "primary", disabled: validationDisabled }), label: "\u0430\u0432\u0442\u043E\u043F\u0435\u0440\u0435\u0434\u0435\u043B\u043A\u0430", sx: { mt: 0.5, display: 'block' } }),
|
|
107107
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107930
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: uploadAfterValidatorOk, onChange: (e) => handleUploadAfterValidatorOkChange(e.target.checked), color: "primary", disabled: validationDisabled }), label: "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044C \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438", sx: { mt: 0.5, display: 'block' } }),
|
|
107931
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { sx: { mt: 0, mx: 0 } }, validationDisabled
|
|
107108
107932
|
? 'Недоступно, пока проверка отключена.'
|
|
107109
|
-
: 'Один раз на слот креатива: при сбое проверки (сеть, таймаут, ошибка API) или когда валидатор вернул «нужна пересборка» с замечаниями — автоматически одна полная переделка с нуля (исходный промпт + product, без правок по списку ошибок).')
|
|
107110
|
-
|
|
107933
|
+
: 'Один раз на слот креатива: при сбое проверки (сеть, таймаут, ошибка API) или когда валидатор вернул «нужна пересборка» с замечаниями — автоматически одна полная переделка с нуля (исходный промпт + product, без правок по списку ошибок).'),
|
|
107934
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { sx: { mt: 0.5, mx: 0 } }, validationDisabled
|
|
107935
|
+
? ''
|
|
107936
|
+
: '«Загружать после проверки»: при ответе валидатора OK файл сразу загружается в папку оффера на Google Drive (нужны URL папки и вход в Google).'))),
|
|
107937
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', md: 'row' }, spacing: 2, sx: { mb: 2, alignItems: 'stretch' } },
|
|
107111
107938
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], { fullWidth: true, variant: "outlined", sx: { flex: { md: '1 1 0' }, minWidth: { md: 0 } } },
|
|
107112
107939
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u0432"),
|
|
107113
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: selectedContentModel, onChange: (e) => handleContentModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u0432", disabled: loadingValidationModels || chatModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true },
|
|
107940
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: chatModels.some(m => m.id === selectedContentModel) ? selectedContentModel : '', onChange: (e) => handleContentModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u0432", disabled: loadingValidationModels || chatModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true },
|
|
107114
107941
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
|
|
107115
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107116
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : chatModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (chatModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
|
|
107117
|
-
!loadingValidationModels && chatModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107942
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
|
|
107943
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : chatModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (chatModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
|
|
107944
|
+
!loadingValidationModels && chatModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, selectedContentModel === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.contentGeneration
|
|
107118
107945
|
? 'Заголовки, описания, пары и перевод — модель по умолчанию из кода'
|
|
107119
107946
|
: 'Заголовки и тексты: ' +
|
|
107120
107947
|
(chatModels.find(m => m.id === selectedContentModel)?.name ||
|
|
107121
107948
|
selectedContentModel)))),
|
|
107122
107949
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], { fullWidth: true, variant: "outlined", sx: { flex: { md: '1 1 0' }, minWidth: { md: 0 } } },
|
|
107123
107950
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430"),
|
|
107124
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: selectedLandingModel, onChange: (e) => handleLandingModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430", disabled: loadingValidationModels || chatModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true },
|
|
107951
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: chatModels.some(m => m.id === selectedLandingModel) ? selectedLandingModel : '', onChange: (e) => handleLandingModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430", disabled: loadingValidationModels || chatModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true },
|
|
107125
107952
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
|
|
107126
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107127
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : chatModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (chatModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
|
|
107128
|
-
!loadingValidationModels && chatModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107953
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
|
|
107954
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : chatModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (chatModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
|
|
107955
|
+
!loadingValidationModels && chatModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, selectedLandingModel === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.landingGeneration
|
|
107129
107956
|
? 'HTML лендинга — модель по умолчанию из кода'
|
|
107130
107957
|
: 'Лендинг: ' +
|
|
107131
107958
|
(chatModels.find(m => m.id === selectedLandingModel)?.name ||
|
|
107132
107959
|
selectedLandingModel))))))),
|
|
107133
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107134
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107135
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107136
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107960
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
|
|
107961
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "primary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_43__["default"], null), onClick: handleGenerateContent, disabled: generating || loadingContentFromDrive || !openaiApiKey || !generateProduct.trim() || !generateGeo.trim(), sx: { flexGrow: 1 }, size: "large" }, generating ? 'Generating...' : 'Generate Titles & Descriptions'),
|
|
107962
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, alignItems: "center", sx: { flexGrow: 1 } },
|
|
107963
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: imageAspectRatio === '1:1'
|
|
107137
107964
|
? '1:1 — квадрат (1024×1024 px)'
|
|
107138
107965
|
: imageAspectRatio === '2:3'
|
|
107139
107966
|
? '2:3 — портрет (1024×1536 px)'
|
|
@@ -107158,7 +107985,7 @@ ${imageData.originalPrompt}
|
|
|
107158
107985
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_31__["default"], { value: "1:1", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "1:1"),
|
|
107159
107986
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_31__["default"], { value: "2:3", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "2:3"),
|
|
107160
107987
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_31__["default"], { value: "both", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "\u041E\u0431\u0430")))),
|
|
107161
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107988
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "secondary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_43__["default"], null), onClick: handleGenerateImages, disabled: generatingImages ||
|
|
107162
107989
|
!openaiApiKey ||
|
|
107163
107990
|
(!accessToken && !refreshToken) ||
|
|
107164
107991
|
!generateProduct.trim() ||
|
|
@@ -107176,9 +108003,9 @@ ${imageData.originalPrompt}
|
|
|
107176
108003
|
: !driveFolderUrl.trim()
|
|
107177
108004
|
? 'Заполните URL папки Google Drive'
|
|
107178
108005
|
: undefined }, generatingImages ? 'Generating Images...' : 'Generate Images')),
|
|
107179
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107180
|
-
uploadedLink && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107181
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108006
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "success", size: "large", onClick: handleGenerate, disabled: loading, startIcon: loading ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20, color: "inherit" }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], null), sx: { py: 1.5, fontSize: '1.1rem', flexGrow: 1 } }, loading ? 'Generating...' : 'Generate Catalog'),
|
|
108007
|
+
uploadedLink && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "success", sx: { flexGrow: 1, minWidth: 0 }, action: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { "aria-label": "copy link", color: "inherit", size: "small", onClick: handleCopyLink, sx: { ml: 1 } },
|
|
108008
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_50__["default"], { fontSize: "small" })) },
|
|
107182
108009
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' } },
|
|
107183
108010
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null,
|
|
107184
108011
|
"\u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D!",
|
|
@@ -107188,17 +108015,17 @@ ${imageData.originalPrompt}
|
|
|
107188
108015
|
getElectronAPI().openExternal(uploadedLink);
|
|
107189
108016
|
}, style: { cursor: 'pointer', textDecoration: 'underline', color: 'inherit' } }, "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 Google Drive")),
|
|
107190
108017
|
linkCopied && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'success.dark', fontWeight: 'bold' } }, "\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E!"))))),
|
|
107191
|
-
folderFilesInfo !== null && !folderFilesInfo.hasProduct && driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108018
|
+
folderFilesInfo !== null && !folderFilesInfo.hasProduct && driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "warning", sx: { mt: 1 } }, "\u0414\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F product.png/jpg/webp. \u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0441\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0433\u043E \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043D\u043E\u043F\u043A\u0438 \"Generate Product from Banka\".")),
|
|
107192
108019
|
!generatingImages && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
107193
|
-
!openaiApiKey && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107194
|
-
openaiApiKey && (!accessToken && !refreshToken) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107195
|
-
openaiApiKey && (accessToken || refreshToken) && !generateProduct.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107196
|
-
openaiApiKey && (accessToken || refreshToken) && generateProduct.trim() && !generateGeo.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107197
|
-
openaiApiKey && (accessToken || refreshToken) && generateProduct.trim() && generateGeo.trim() && !driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108020
|
+
!openaiApiKey && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 OpenRouter API Key")),
|
|
108021
|
+
openaiApiKey && (!accessToken && !refreshToken) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0412\u043E\u0439\u0434\u0438\u0442\u0435 \u0432 Google Drive")),
|
|
108022
|
+
openaiApiKey && (accessToken || refreshToken) && !generateProduct.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u043F\u043E\u043B\u0435 \u0422\u043E\u0432\u0430\u0440")),
|
|
108023
|
+
openaiApiKey && (accessToken || refreshToken) && generateProduct.trim() && !generateGeo.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u043F\u043E\u043B\u0435 \u0413\u0435\u043E")),
|
|
108024
|
+
openaiApiKey && (accessToken || refreshToken) && generateProduct.trim() && generateGeo.trim() && !driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 URL \u043F\u0430\u043F\u043A\u0438 Google Drive"))))),
|
|
107198
108025
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "file", ref: productFileInputRef, accept: "image/png,image/jpeg,image/jpg,image/webp", style: { display: 'none' }, onChange: handleProductFileSelected }),
|
|
107199
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107200
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107201
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108026
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
|
|
108027
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "success", startIcon: uploadingProduct ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20, color: "inherit" }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], null), onClick: handleUploadProductFile, disabled: uploadingProduct || !accessToken || !driveFolderUrl.trim(), sx: { flexGrow: 1 }, size: "large" }, uploadingProduct ? 'Загрузка...' : 'Загрузить product.png/jpg/webp'),
|
|
108028
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "info", startIcon: generatingLanding ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20, color: "inherit" }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_57__["default"], null), onClick: handleCreateLanding, disabled: generatingLanding ||
|
|
107202
108029
|
!openaiApiKey ||
|
|
107203
108030
|
!accessToken ||
|
|
107204
108031
|
!driveFolderUrl.trim() ||
|
|
@@ -107213,10 +108040,22 @@ ${imageData.originalPrompt}
|
|
|
107213
108040
|
generatedImagesData.length,
|
|
107214
108041
|
")"),
|
|
107215
108042
|
checkingImages && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1, mb: 2 } },
|
|
107216
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108043
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
|
|
107217
108044
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary' } }, "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0430..."))),
|
|
107218
|
-
|
|
107219
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108045
|
+
pendingDriveUploadCreos.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 1, sx: { mb: 2 }, useFlexGap: true },
|
|
108046
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "primary", onClick: () => void handleUploadAllImages(), disabled: uploadingImages || generatingImages || !driveFolderUrl.trim(), startIcon: uploadingImages ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], null), fullWidth: true, sx: { flex: 1 } }, uploadingImages
|
|
108047
|
+
? 'Загрузка...'
|
|
108048
|
+
: `Загрузить все (${pendingDriveUploadCreos.length})`),
|
|
108049
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: pendingValidatorOkDriveUploadCreos.length === 0
|
|
108050
|
+
? 'Нет незагруженных крео с успешной проверкой валидатором (ожидайте проверки или исправьте ошибки).'
|
|
108051
|
+
: 'Только крео со статусом «Проверка пройдена», как в карточке (валидатор вернул OK).' },
|
|
108052
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { style: { flex: 1, display: 'flex' } },
|
|
108053
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "success", onClick: () => void handleUploadAllImages({ correctOnly: true }), disabled: uploadingImages ||
|
|
108054
|
+
generatingImages ||
|
|
108055
|
+
!driveFolderUrl.trim() ||
|
|
108056
|
+
pendingValidatorOkDriveUploadCreos.length === 0, startIcon: uploadingImages ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_47__["default"], null), fullWidth: true, sx: { flex: 1 } }, uploadingImages
|
|
108057
|
+
? 'Загрузка...'
|
|
108058
|
+
: `Загрузить правильные (${pendingValidatorOkDriveUploadCreos.length})`))))),
|
|
107220
108059
|
generatedImagesData.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
|
|
107221
108060
|
display: 'grid',
|
|
107222
108061
|
gridTemplateColumns: { xs: '1fr', sm: 'repeat(2, 1fr)', md: 'repeat(3, 1fr)' },
|
|
@@ -107253,9 +108092,9 @@ ${imageData.originalPrompt}
|
|
|
107253
108092
|
}
|
|
107254
108093
|
: {})
|
|
107255
108094
|
} },
|
|
107256
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108095
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u0440\u0435\u0430\u0442\u0438\u0432" },
|
|
107257
108096
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null,
|
|
107258
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108097
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u0440\u0435\u0430\u0442\u0438\u0432", sx: {
|
|
107259
108098
|
position: 'absolute',
|
|
107260
108099
|
top: 6,
|
|
107261
108100
|
right: 6,
|
|
@@ -107281,8 +108120,8 @@ ${imageData.originalPrompt}
|
|
|
107281
108120
|
!!imageData.regenerating ||
|
|
107282
108121
|
!!imageData.uploading ||
|
|
107283
108122
|
deletingDriveImageIndex === imageData.index },
|
|
107284
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107285
|
-
imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108123
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_52__["default"], { fontSize: "small" })))),
|
|
108124
|
+
imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u041D\u0430 \u0432\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D", sx: {
|
|
107286
108125
|
position: 'absolute',
|
|
107287
108126
|
top: 6,
|
|
107288
108127
|
left: 6,
|
|
@@ -107309,7 +108148,7 @@ ${imageData.originalPrompt}
|
|
|
107309
108148
|
}), disabled: imageData.generating ||
|
|
107310
108149
|
!!imageData.uploading ||
|
|
107311
108150
|
deletingDriveImageIndex === imageData.index },
|
|
107312
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108151
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_54__["default"], { fontSize: "small" }))) : null,
|
|
107313
108152
|
imageData.generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
|
|
107314
108153
|
width: '100%',
|
|
107315
108154
|
aspectRatio: aspectRatioCss,
|
|
@@ -107325,7 +108164,7 @@ ${imageData.originalPrompt}
|
|
|
107325
108164
|
gap: 2,
|
|
107326
108165
|
p: 3
|
|
107327
108166
|
} },
|
|
107328
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108167
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 40, sx: { color: 'primary.main' } }),
|
|
107329
108168
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", sx: { color: 'text.secondary', textAlign: 'center', fontWeight: 'bold' } }, "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F..."),
|
|
107330
108169
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary', textAlign: 'center' } }, imageData.approach),
|
|
107331
108170
|
generatingImages && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary', textAlign: 'center' } },
|
|
@@ -107345,7 +108184,7 @@ ${imageData.originalPrompt}
|
|
|
107345
108184
|
gap: 2,
|
|
107346
108185
|
p: 3
|
|
107347
108186
|
} },
|
|
107348
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108187
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 40, sx: { color: 'primary.main' } }),
|
|
107349
108188
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", sx: { color: 'text.secondary', textAlign: 'center', fontWeight: 'bold' } }, "\u041F\u0435\u0440\u0435\u0434\u0435\u043B\u043A\u0430..."),
|
|
107350
108189
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary', textAlign: 'center' } }, imageData.approach))) : imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, hideUploadedPreview ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
|
|
107351
108190
|
width: '100%',
|
|
@@ -107364,14 +108203,14 @@ ${imageData.originalPrompt}
|
|
|
107364
108203
|
boxSizing: 'border-box'
|
|
107365
108204
|
} },
|
|
107366
108205
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary", align: "center", sx: { px: 1 } }, "\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043E \u043D\u0430 Google \u0414\u0438\u0441\u043A \u2014 \u043F\u0440\u0435\u0432\u044C\u044E \u0441\u043A\u0440\u044B\u0442\u043E"),
|
|
107367
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107368
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108206
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, flexWrap: "wrap", justifyContent: "center" },
|
|
108207
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "contained", onClick: () => setGeneratedImagesData(prev => prev.map(img => img.index === imageData.index
|
|
107369
108208
|
? { ...img, uploadedPreviewHidden: false }
|
|
107370
108209
|
: img)) }, "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0440\u0435\u0432\u044C\u044E"),
|
|
107371
|
-
imageData.driveUploadedFileId ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108210
|
+
imageData.driveUploadedFileId ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", color: "error", disabled: deletingDriveImageIndex === imageData.index, onClick: () => void handleDeleteCreativeFromDrive(imageData) }, deletingDriveImageIndex === imageData.index
|
|
107372
108211
|
? 'Удаление…'
|
|
107373
108212
|
: 'Удалить с Диска')) : null,
|
|
107374
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108213
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_54__["default"], null), onClick: () => setCreoFullscreen({
|
|
107375
108214
|
url: imageData.imageUrl,
|
|
107376
108215
|
title: `${imageData.index}. ${imageData.approach}`
|
|
107377
108216
|
}), disabled: !!imageData.uploading || deletingDriveImageIndex === imageData.index }, "\u041D\u0430 \u0432\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D")))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
@@ -107394,13 +108233,13 @@ ${imageData.originalPrompt}
|
|
|
107394
108233
|
alignItems: 'center',
|
|
107395
108234
|
gap: 1
|
|
107396
108235
|
} },
|
|
107397
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108236
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 40, sx: { color: 'primary.main' } }),
|
|
107398
108237
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'white', fontWeight: 'bold', textShadow: '1px 1px 2px rgba(0,0,0,0.8)' } }, "\u041F\u0435\u0440\u0435\u0434\u0435\u043B\u043A\u0430..."))),
|
|
107399
108238
|
imageData.uploaded && !imageData.regenerating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', justifyContent: 'center', mt: 0.5 } },
|
|
107400
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108239
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "text", onClick: () => setGeneratedImagesData(prev => prev.map(img => img.index === imageData.index
|
|
107401
108240
|
? { ...img, uploadedPreviewHidden: true }
|
|
107402
108241
|
: img)) }, "\u0421\u043A\u0440\u044B\u0442\u044C \u043F\u0440\u0435\u0432\u044C\u044E"),
|
|
107403
|
-
imageData.driveUploadedFileId ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108242
|
+
imageData.driveUploadedFileId ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", color: "error", sx: { ml: 1 }, disabled: deletingDriveImageIndex === imageData.index, onClick: () => void handleDeleteCreativeFromDrive(imageData) }, deletingDriveImageIndex === imageData.index
|
|
107404
108243
|
? 'Удаление…'
|
|
107405
108244
|
: 'Удалить с Диска')) : null)) : null)))) : imageData.failed ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
|
|
107406
108245
|
width: '100%',
|
|
@@ -107450,25 +108289,46 @@ ${imageData.originalPrompt}
|
|
|
107450
108289
|
!hideUploadedPreview && imageData.checkStatus === 'ok' && imageData.checkResult !== 'Проверка отключена' && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'success.main', display: 'block', fontWeight: 'bold' } }, "\u2705 \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430")),
|
|
107451
108290
|
!hideUploadedPreview && imageData.checkStatus === 'needs_rebuild' && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
|
|
107452
108291
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'error.main', display: 'block', fontWeight: 'bold' } }, imageData.checkFailed ? '⚠️ Ошибка проверки' : '❌ Требует пересборки'),
|
|
107453
|
-
imageData.checkErrors && imageData.checkErrors.length > 0 &&
|
|
108292
|
+
imageData.checkErrors && imageData.checkErrors.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { mt: 0.5 } },
|
|
107454
108293
|
imageData.checkErrors.slice(0, 2).map((error, idx) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { key: idx, variant: "caption", sx: {
|
|
107455
108294
|
color: 'error.main',
|
|
107456
108295
|
display: 'block',
|
|
107457
108296
|
fontSize: '0.7rem',
|
|
107458
|
-
lineHeight: 1.
|
|
108297
|
+
lineHeight: 1.35,
|
|
108298
|
+
wordBreak: 'break-word'
|
|
107459
108299
|
} },
|
|
107460
108300
|
"\u2022 ",
|
|
107461
|
-
error.length >
|
|
108301
|
+
error.length > 220 ? error.substring(0, 220) + '…' : error))),
|
|
107462
108302
|
imageData.checkErrors.length > 2 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary', fontSize: '0.7rem' } },
|
|
107463
108303
|
"+",
|
|
107464
108304
|
imageData.checkErrors.length - 2,
|
|
107465
108305
|
" \u0435\u0449\u0451")))))),
|
|
108306
|
+
(() => {
|
|
108307
|
+
const checkedOk = imageData.checkStatus === 'ok' &&
|
|
108308
|
+
imageData.checkResult &&
|
|
108309
|
+
imageData.checkResult.trim() !== '' &&
|
|
108310
|
+
imageData.checkResult !== 'Проверка отключена';
|
|
108311
|
+
const checkedRebuild = imageData.checkStatus === 'needs_rebuild';
|
|
108312
|
+
if (!checkedOk && !checkedRebuild)
|
|
108313
|
+
return null;
|
|
108314
|
+
const body = (imageData.checkResult && imageData.checkResult.trim()) ||
|
|
108315
|
+
(imageData.checkErrors?.length
|
|
108316
|
+
? imageData.checkErrors.join('\n\n')
|
|
108317
|
+
: '');
|
|
108318
|
+
if (!body)
|
|
108319
|
+
return null;
|
|
108320
|
+
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "text", sx: { mt: 0.5, p: 0, minHeight: 'auto', fontSize: '0.7rem', textTransform: 'none', alignSelf: 'flex-start', display: 'block' }, onClick: () => setValidatorDebugDialog({
|
|
108321
|
+
kind: imageData.checkFailed ? 'transport' : 'validator',
|
|
108322
|
+
subtitle: `${imageData.index}. ${imageData.approach}`,
|
|
108323
|
+
text: body
|
|
108324
|
+
}) }, imageData.checkFailed ? 'Детали ошибки проверки' : 'Полный ответ валидатора'));
|
|
108325
|
+
})(),
|
|
107466
108326
|
!hideUploadedPreview && imageData.checkStatus === 'checking' && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'warning.main', display: 'block' } }, "\uD83D\uDD0D \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442\u0441\u044F...")),
|
|
107467
108327
|
!hideUploadedPreview && imageData.checkStatus === 'pending' && !imageData.failed && !imageData.generating && imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary', display: 'block' } }, "\u23F3 \u041E\u0436\u0438\u0434\u0430\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438")),
|
|
107468
108328
|
!hideUploadedPreview && imageData.failed && !imageData.generating && !imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'error.main', display: 'block', fontWeight: 'bold' } }, "\u274C \u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u043D\u0435 \u0443\u0434\u0430\u043B\u0430\u0441\u044C")),
|
|
107469
108329
|
!hideUploadedPreview && imageData.uploaded && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'success.main', display: 'block', mt: 0.5 } }, "\u2713 \u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043E"))),
|
|
107470
108330
|
!imageData.generating && !hideUploadedPreview && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', gap: 1, flexDirection: 'column', mt: 1 } },
|
|
107471
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108331
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { size: "small", multiline: true, minRows: 2, maxRows: 4, fullWidth: true, placeholder: "\u0423\u0442\u043E\u0447\u043D\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0434\u0435\u043B\u043A\u0438 (\u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u043E \u043F\u0440\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u0445)", value: imageData.customRegeneratePrompt || '', onChange: (e) => {
|
|
107472
108332
|
setGeneratedImagesData(prev => prev.map(img => img.index === imageData.index
|
|
107473
108333
|
? { ...img, customRegeneratePrompt: e.target.value }
|
|
107474
108334
|
: img));
|
|
@@ -107485,8 +108345,8 @@ ${imageData.originalPrompt}
|
|
|
107485
108345
|
: 'transparent'
|
|
107486
108346
|
}
|
|
107487
108347
|
} }),
|
|
107488
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107489
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108348
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, sx: { width: '100%', alignItems: 'stretch' } },
|
|
108349
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "contained", color: imageData.failed ? 'error' : imageData.checkStatus === 'needs_rebuild' ? 'warning' : 'primary', startIcon: imageData.regenerating ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_43__["default"], null), onClick: () => handleRegenerateImage(imageData), disabled: imageData.regenerating ||
|
|
107490
108350
|
imageData.uploading ||
|
|
107491
108351
|
imageData.checkStatus === 'checking' ||
|
|
107492
108352
|
!imageData.originalPrompt ||
|
|
@@ -107496,24 +108356,36 @@ ${imageData.originalPrompt}
|
|
|
107496
108356
|
: ((generatingImages && !imageData.imageUrl && !imageData.failed && !imageData.generating)
|
|
107497
108357
|
? 'В очереди'
|
|
107498
108358
|
: (!imageData.imageUrl ? 'Сгенерировать' : 'Переделать'))),
|
|
107499
|
-
imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108359
|
+
imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", color: "secondary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_59__["default"], null), onClick: () => handleRegenerateImageFresh(imageData), disabled: imageData.regenerating ||
|
|
107500
108360
|
imageData.uploading ||
|
|
107501
108361
|
imageData.checkStatus === 'checking' ||
|
|
107502
108362
|
!imageData.originalPrompt ||
|
|
107503
108363
|
!imageData.productImageUrl, sx: { flex: 1, minWidth: 0, py: 1, lineHeight: 1.2, whiteSpace: 'normal' } }, "\u041F\u0435\u0440\u0435\u0434\u0435\u043B\u0430\u0442\u044C \u0437\u0430\u043D\u043E\u0432\u043E")) : null),
|
|
107504
|
-
imageData.imageUrl && !validationDisabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108364
|
+
imageData.imageUrl && !validationDisabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", color: "warning", startIcon: imageData.checkStatus === 'checking' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16, color: "inherit" })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_59__["default"], null)), onClick: () => handleRetryCheck(imageData), disabled: imageData.regenerating ||
|
|
107505
108365
|
imageData.uploading ||
|
|
107506
108366
|
imageData.generating ||
|
|
107507
108367
|
imageData.checkStatus === 'checking', fullWidth: true }, imageData.checkStatus === 'checking' ? 'Проверка…' : 'Перепроверить')),
|
|
107508
|
-
!imageData.uploaded && imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108368
|
+
!imageData.uploaded && imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], null), onClick: () => {
|
|
107509
108369
|
const folderId = extractFolderId(driveFolderUrl);
|
|
107510
108370
|
if (folderId) {
|
|
107511
108371
|
handleUploadImage(imageData, folderId);
|
|
107512
108372
|
}
|
|
107513
108373
|
}, disabled: imageData.uploading || imageData.regenerating || !driveFolderUrl.trim(), fullWidth: true }, imageData.uploading ? 'Загрузка...' : 'Загрузить'))))));
|
|
107514
108374
|
}))),
|
|
107515
|
-
|
|
107516
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108375
|
+
pendingDriveUploadCreos.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 1, sx: { mt: 2 }, useFlexGap: true },
|
|
108376
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "primary", onClick: () => void handleUploadAllImages(), disabled: uploadingImages || generatingImages || !driveFolderUrl.trim(), startIcon: uploadingImages ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], null), fullWidth: true, sx: { flex: 1 } }, uploadingImages
|
|
108377
|
+
? 'Загрузка...'
|
|
108378
|
+
: `Загрузить все (${pendingDriveUploadCreos.length})`),
|
|
108379
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: pendingValidatorOkDriveUploadCreos.length === 0
|
|
108380
|
+
? 'Нет незагруженных крео с успешной проверкой валидатором (ожидайте проверки или исправьте ошибки).'
|
|
108381
|
+
: 'Только крео со статусом «Проверка пройдена», как в карточке (валидатор вернул OK).' },
|
|
108382
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { style: { flex: 1, display: 'flex' } },
|
|
108383
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "success", onClick: () => void handleUploadAllImages({ correctOnly: true }), disabled: uploadingImages ||
|
|
108384
|
+
generatingImages ||
|
|
108385
|
+
!driveFolderUrl.trim() ||
|
|
108386
|
+
pendingValidatorOkDriveUploadCreos.length === 0, startIcon: uploadingImages ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_47__["default"], null), fullWidth: true, sx: { flex: 1 } }, uploadingImages
|
|
108387
|
+
? 'Загрузка...'
|
|
108388
|
+
: `Загрузить правильные (${pendingValidatorOkDriveUploadCreos.length})`))))),
|
|
107517
108389
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { fullScreen: true, open: Boolean(creoFullscreen), onClose: () => setCreoFullscreen(null), PaperProps: {
|
|
107518
108390
|
sx: {
|
|
107519
108391
|
m: 0,
|
|
@@ -107534,9 +108406,9 @@ ${imageData.originalPrompt}
|
|
|
107534
108406
|
flexShrink: 0
|
|
107535
108407
|
} },
|
|
107536
108408
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle1", sx: { color: '#fff', flex: 1, pr: 1 }, noWrap: true }, creoFullscreen?.title),
|
|
107537
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107538
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107539
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108409
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C (Esc)" },
|
|
108410
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { "aria-label": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u043F\u043E\u043B\u043D\u043E\u044D\u043A\u0440\u0430\u043D\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440", onClick: () => setCreoFullscreen(null), sx: { color: '#fff' } },
|
|
108411
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_48__["default"], null)))),
|
|
107540
108412
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
|
|
107541
108413
|
flex: 1,
|
|
107542
108414
|
minHeight: 0,
|
|
@@ -107552,8 +108424,29 @@ ${imageData.originalPrompt}
|
|
|
107552
108424
|
height: 'auto',
|
|
107553
108425
|
objectFit: 'contain',
|
|
107554
108426
|
borderRadius: 1
|
|
107555
|
-
} })) : null))
|
|
107556
|
-
|
|
108427
|
+
} })) : null)),
|
|
108428
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { open: Boolean(validatorDebugDialog), onClose: () => setValidatorDebugDialog(null), maxWidth: "md", fullWidth: true, scroll: "paper" },
|
|
108429
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { sx: { pr: 5 } },
|
|
108430
|
+
validatorDebugDialog?.kind === 'transport'
|
|
108431
|
+
? 'Детали ошибки проверки'
|
|
108432
|
+
: 'Полный ответ модели-валидатора',
|
|
108433
|
+
validatorDebugDialog?.subtitle ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { component: "div", variant: "caption", color: "text.secondary", sx: { display: 'block', mt: 0.5, fontWeight: 400 } }, validatorDebugDialog.subtitle)) : null),
|
|
108434
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__["default"], { dividers: true },
|
|
108435
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { value: validatorDebugDialog?.text ?? '', multiline: true, fullWidth: true, minRows: 14, maxRows: 32, InputProps: { readOnly: true }, variant: "outlined", size: "small", sx: {
|
|
108436
|
+
'& .MuiInputBase-input': {
|
|
108437
|
+
fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',
|
|
108438
|
+
fontSize: '0.8rem',
|
|
108439
|
+
lineHeight: 1.45
|
|
108440
|
+
}
|
|
108441
|
+
} })),
|
|
108442
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__["default"], { sx: { px: 2, py: 1.5 } },
|
|
108443
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_50__["default"], null), onClick: () => {
|
|
108444
|
+
const t = validatorDebugDialog?.text;
|
|
108445
|
+
if (t)
|
|
108446
|
+
void navigator.clipboard.writeText(t);
|
|
108447
|
+
}, disabled: !validatorDebugDialog?.text }, "\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C"),
|
|
108448
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", onClick: () => setValidatorDebugDialog(null) }, "\u0417\u0430\u043A\u0440\u044B\u0442\u044C"))))),
|
|
108449
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { sx: { my: 2 } }),
|
|
107557
108450
|
(generatedTitlesData.length > 0 || generatedTextsData.length > 0 || loadingContentFromDrive) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { mb: 2 } },
|
|
107558
108451
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 1, mb: 1 } },
|
|
107559
108452
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h6", sx: { fontWeight: 'bold' }, component: "div" },
|
|
@@ -107562,14 +108455,14 @@ ${imageData.originalPrompt}
|
|
|
107562
108455
|
"/",
|
|
107563
108456
|
Math.max(generatedTitlesData.length, generatedTextsData.length),
|
|
107564
108457
|
")"),
|
|
107565
|
-
(generatedTitlesData.length > 0 || generatedTextsData.length > 0) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107566
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108458
|
+
(generatedTitlesData.length > 0 || generatedTextsData.length > 0) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: pairsJsonCopied ? 'Скопировано' : 'Скопировать все пары как JSON-массив' },
|
|
108459
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0430\u0440\u044B \u043A\u0430\u043A JSON", onClick: () => void copyGeneratedPairsAsJson(), disabled: generating, sx: {
|
|
107567
108460
|
opacity: 0.28,
|
|
107568
108461
|
p: 0.35,
|
|
107569
108462
|
color: 'text.secondary',
|
|
107570
108463
|
'&:hover': { opacity: 0.75, color: 'text.primary' },
|
|
107571
108464
|
} },
|
|
107572
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108465
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_50__["default"], { sx: { fontSize: 16 } }))))),
|
|
107573
108466
|
loadingContentFromDrive && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
|
|
107574
108467
|
display: 'flex',
|
|
107575
108468
|
flexDirection: 'column',
|
|
@@ -107584,10 +108477,10 @@ ${imageData.originalPrompt}
|
|
|
107584
108477
|
: 'rgba(25, 118, 210, 0.05)',
|
|
107585
108478
|
mb: 2
|
|
107586
108479
|
} },
|
|
107587
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108480
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 40, sx: { color: 'primary.main' } }),
|
|
107588
108481
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body1", sx: { color: 'text.secondary', fontWeight: 'bold' } }, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 \u0438\u0437 Google Drive..."))),
|
|
107589
|
-
(generatedTitlesData.length > 0 || generatedTextsData.length > 0) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107590
|
-
pairTranslationFailed && !translatingPairs && !generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108482
|
+
(generatedTitlesData.length > 0 || generatedTextsData.length > 0) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 2 },
|
|
108483
|
+
pairTranslationFailed && !translatingPairs && !generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "warning", action: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { color: "inherit", size: "small", onClick: handleRetryPairTranslation, sx: { textTransform: 'none', whiteSpace: 'nowrap' } }, "\u0417\u0430\u043F\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u043E\u0434") }, "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u043E\u0434 \u043F\u0430\u0440 \u043D\u0430 \u0440\u0443\u0441\u0441\u043A\u0438\u0439 (\u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u043A \u043C\u043E\u0434\u0435\u043B\u0438).")) : null,
|
|
107591
108484
|
Array.from({
|
|
107592
108485
|
length: Math.max(generatedTitlesData.length, generatedTextsData.length)
|
|
107593
108486
|
}, (_, i) => i).map((i) => {
|
|
@@ -107598,7 +108491,7 @@ ${imageData.originalPrompt}
|
|
|
107598
108491
|
const pairLabel = pairApproach ? pairApproach.name : `пара ${i + 1}`;
|
|
107599
108492
|
const pairGenerating = (titleData?.generating || textData?.generating);
|
|
107600
108493
|
const pairFailed = (!pairGenerating && titleData?.failed && textData?.failed);
|
|
107601
|
-
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108494
|
+
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { key: i, variant: "outlined", sx: {
|
|
107602
108495
|
p: 2,
|
|
107603
108496
|
borderColor: pairFailed
|
|
107604
108497
|
? 'error.main'
|
|
@@ -107610,7 +108503,7 @@ ${imageData.originalPrompt}
|
|
|
107610
108503
|
? (theme.palette.mode === 'dark' ? 'rgba(25,118,210,0.05)' : 'rgba(25,118,210,0.02)')
|
|
107611
108504
|
: 'transparent',
|
|
107612
108505
|
} },
|
|
107613
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108506
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, alignItems: "center", sx: { mb: 1.5, flexWrap: 'wrap' } },
|
|
107614
108507
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: {
|
|
107615
108508
|
fontWeight: 700,
|
|
107616
108509
|
px: 1,
|
|
@@ -107627,16 +108520,16 @@ ${imageData.originalPrompt}
|
|
|
107627
108520
|
i + 1),
|
|
107628
108521
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary" }, pairLabel),
|
|
107629
108522
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { flexGrow: 1, minWidth: 8 } }),
|
|
107630
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108523
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0430\u0440\u0443" },
|
|
107631
108524
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null,
|
|
107632
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107633
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107634
|
-
translatingPairs && !pairTranslations[i] ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107635
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108525
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", color: "error", "aria-label": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0430\u0440\u0443", onClick: () => handleDeleteGeneratedPair(i), disabled: pairGenerating || generating },
|
|
108526
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_52__["default"], { fontSize: "small" })))),
|
|
108527
|
+
translatingPairs && !pairTranslations[i] ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 13, sx: { color: 'text.disabled', ml: 0.5 } })) : null),
|
|
108528
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 1.5 },
|
|
107636
108529
|
titleData && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
107637
108530
|
titleData.generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
|
|
107638
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107639
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430\u2026"))) : titleData.failed ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108531
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16, sx: { color: 'primary.main' } }),
|
|
108532
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430\u2026"))) : titleData.failed ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: `Заголовок ${i + 1}`, variant: "outlined", fullWidth: true, size: "small", value: titleData.title, placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0432\u0440\u0443\u0447\u043D\u0443\u044E", helperText: titleData.errorMessage ? `Не сгенерирован: ${titleData.errorMessage}` : 'Можно ввести или исправить заголовок вручную', error: !!titleData.errorMessage, onChange: (e) => {
|
|
107640
108533
|
const newValue = e.target.value;
|
|
107641
108534
|
setGeneratedTitlesData(prev => {
|
|
107642
108535
|
const updated = prev.map(t => t.index === titleData.index
|
|
@@ -107651,7 +108544,7 @@ ${imageData.originalPrompt}
|
|
|
107651
108544
|
? 'rgba(244,67,54,0.08)'
|
|
107652
108545
|
: 'rgba(244,67,54,0.04)'
|
|
107653
108546
|
}
|
|
107654
|
-
} })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108547
|
+
} })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: `Заголовок ${i + 1}`, variant: "outlined", fullWidth: true, size: "small", value: titleData.title, onChange: (e) => {
|
|
107655
108548
|
const newValue = e.target.value;
|
|
107656
108549
|
setGeneratedTitlesData(prev => {
|
|
107657
108550
|
const updated = prev.map(t => t.index === titleData.index ? { ...t, title: newValue } : t);
|
|
@@ -107676,8 +108569,8 @@ ${imageData.originalPrompt}
|
|
|
107676
108569
|
} }, pairTranslations[i].titleRu)) : null)),
|
|
107677
108570
|
textData && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
107678
108571
|
textData.generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
|
|
107679
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107680
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0442\u0435\u043A\u0441\u0442\u0430\u2026"))) : textData.failed ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108572
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16, sx: { color: 'primary.main' } }),
|
|
108573
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0442\u0435\u043A\u0441\u0442\u0430\u2026"))) : textData.failed ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: `Текст ${i + 1}`, variant: "outlined", fullWidth: true, multiline: true, minRows: 3, value: textData.text, placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442 \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0443\u0447\u043D\u0443\u044E", helperText: textData.errorMessage ? `Не сгенерирован: ${textData.errorMessage}` : 'Можно ввести или исправить текст вручную', error: !!textData.errorMessage, onChange: (e) => {
|
|
107681
108574
|
const newValue = e.target.value;
|
|
107682
108575
|
setGeneratedTextsData(prev => {
|
|
107683
108576
|
const updated = prev.map(t => t.index === textData.index
|
|
@@ -107692,7 +108585,7 @@ ${imageData.originalPrompt}
|
|
|
107692
108585
|
? 'rgba(244,67,54,0.08)'
|
|
107693
108586
|
: 'rgba(244,67,54,0.04)'
|
|
107694
108587
|
}
|
|
107695
|
-
} })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108588
|
+
} })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: `Текст ${i + 1}`, variant: "outlined", fullWidth: true, multiline: true, minRows: 3, value: textData.text, onChange: (e) => {
|
|
107696
108589
|
const newValue = e.target.value;
|
|
107697
108590
|
setGeneratedTextsData(prev => {
|
|
107698
108591
|
const updated = prev.map(t => t.index === textData.index ? { ...t, text: newValue } : t);
|
|
@@ -107720,7 +108613,7 @@ ${imageData.originalPrompt}
|
|
|
107720
108613
|
}))))),
|
|
107721
108614
|
(landingGenerationLogs.length > 0 || generatingLanding) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { mb: 2 } },
|
|
107722
108615
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h6", gutterBottom: true, sx: { fontWeight: 'bold' } }, "\u041F\u0440\u043E\u0446\u0435\u0441\u0441 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430"),
|
|
107723
|
-
landingGenerationLogs.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108616
|
+
landingGenerationLogs.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { sx: {
|
|
107724
108617
|
p: 2,
|
|
107725
108618
|
backgroundColor: (theme) => theme.palette.mode === 'dark'
|
|
107726
108619
|
? 'rgba(25, 118, 210, 0.1)'
|
|
@@ -107744,38 +108637,121 @@ ${imageData.originalPrompt}
|
|
|
107744
108637
|
'text.primary'
|
|
107745
108638
|
} }, log)))))),
|
|
107746
108639
|
generatingLanding && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1, mb: 2 } },
|
|
107747
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108640
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20 }),
|
|
107748
108641
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", sx: { color: 'text.secondary' } }, formatElapsedTime(elapsedTime.landing)))),
|
|
107749
|
-
!generatingLanding && generatedLandingHTML && generatedLandingImageBlob && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108642
|
+
!generatingLanding && generatedLandingHTML && generatedLandingImageBlob && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", color: "primary", onClick: handlePreviewLanding, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_61__["default"], null), fullWidth: true }, "\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430"))))))))),
|
|
107750
108643
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { open: approachLoadChoice !== null, onClose: handleApproachLoadKeepCurrent, maxWidth: "md", fullWidth: true }, approachLoadChoice ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
107751
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107752
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108644
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], null, "\u041F\u043E\u0434\u0445\u043E\u0434\u044B \u0438\u0437 \u0444\u0430\u0439\u043B\u0430 \u043E\u0444\u0444\u0435\u0440\u0430"),
|
|
108645
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__["default"], null,
|
|
107753
108646
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 2 } }, "\u0412 project-settings.json \u0435\u0441\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u044B \u0434\u043B\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432/\u0442\u0435\u043A\u0441\u0442\u043E\u0432 \u0438 \u0434\u043B\u044F \u043A\u0440\u0435\u043E. \u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0445 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0438\u043B\u0438 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0442\u0435, \u0447\u0442\u043E \u0443\u0436\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u044B \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E?"),
|
|
107754
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108647
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 2 },
|
|
107755
108648
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle2" }, "\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 \u0438 \u0442\u0435\u043A\u0441\u0442\u044B (\u043F\u0430\u0440\u044B \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432)"),
|
|
107756
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107757
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108649
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
|
|
108650
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
|
|
107758
108651
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", gutterBottom: true }, "\u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438"),
|
|
107759
108652
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", component: "div", sx: { whiteSpace: 'pre-wrap', fontFamily: 'inherit' } }, formatPairApproachesForDisplay(approachLoadChoice.currentPairs))),
|
|
107760
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108653
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
|
|
107761
108654
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", gutterBottom: true }, "\u0412 \u0444\u0430\u0439\u043B\u0435 \u043E\u0444\u0444\u0435\u0440\u0430"),
|
|
107762
108655
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", component: "div", sx: { whiteSpace: 'pre-wrap', fontFamily: 'inherit' } }, approachLoadChoice.savedPairs
|
|
107763
108656
|
? formatPairApproachesForDisplay(approachLoadChoice.savedPairs)
|
|
107764
108657
|
: '— не указано (список для текстов не изменится)'))),
|
|
107765
108658
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle2" }, "\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F (\u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043F\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u0443)"),
|
|
107766
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107767
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108659
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
|
|
108660
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
|
|
107768
108661
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", gutterBottom: true }, "\u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438"),
|
|
107769
108662
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", component: "div", sx: { whiteSpace: 'pre-wrap', fontFamily: 'inherit' } }, formatImageCountsForDisplay(approachLoadChoice.currentCounts))),
|
|
107770
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108663
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
|
|
107771
108664
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", gutterBottom: true }, "\u0412 \u0444\u0430\u0439\u043B\u0435 \u043E\u0444\u0444\u0435\u0440\u0430"),
|
|
107772
108665
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", component: "div", sx: { whiteSpace: 'pre-wrap', fontFamily: 'inherit' } }, approachLoadChoice.savedCounts
|
|
107773
108666
|
? formatImageCountsForDisplay(approachLoadChoice.savedCounts)
|
|
107774
108667
|
: '— не указано (количества крео не изменятся)'))))),
|
|
107775
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107776
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107777
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
107778
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108668
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__["default"], null,
|
|
108669
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { onClick: handleApproachLoadKeepCurrent }, "\u041E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A \u0441\u0435\u0439\u0447\u0430\u0441"),
|
|
108670
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", onClick: handleApproachLoadApplyFromFile }, "\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0437 \u0444\u0430\u0439\u043B\u0430")))) : null),
|
|
108671
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { open: settingsFileMissingDialog.open, onClose: (_, reason) => {
|
|
108672
|
+
if (settingsFileMissingDialog.retrying)
|
|
108673
|
+
return;
|
|
108674
|
+
if (reason === 'backdropClick' || reason === 'escapeKeyDown') {
|
|
108675
|
+
handleSettingsFileMissingDismissOk();
|
|
108676
|
+
}
|
|
108677
|
+
}, maxWidth: "sm", fullWidth: true },
|
|
108678
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], null, "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B"),
|
|
108679
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__["default"], null,
|
|
108680
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 1 } },
|
|
108681
|
+
"\u0412 \u043F\u0430\u043F\u043A\u0435 \u043D\u0435\u0442 \u0444\u0430\u0439\u043B\u0430 ",
|
|
108682
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("code", null, "project-settings.json"),
|
|
108683
|
+
" (\u0438\u043B\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0433\u043E",
|
|
108684
|
+
' ',
|
|
108685
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("code", null, "temp-generated-content.json"),
|
|
108686
|
+
") \u2014 \u0432 \u043A\u043E\u0440\u043D\u0435 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u0438\u043B\u0438 \u0432 \u043F\u0430\u043F\u043A\u0435 ",
|
|
108687
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("code", null, "env"),
|
|
108688
|
+
"."),
|
|
108689
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 1 } }, "\u041C\u043E\u0436\u043D\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443 (\u0438\u043D\u043E\u0433\u0434\u0430 Google \u0414\u0438\u0441\u043A \u0435\u0449\u0451 \u043D\u0435 \u043E\u0442\u0434\u0430\u043B \u0441\u043F\u0438\u0441\u043E\u043A \u0444\u0430\u0439\u043B\u043E\u0432) \u0438\u043B\u0438 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A \u0435\u0441\u0442\u044C, \u0435\u0441\u043B\u0438 \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u043F\u0430\u043F\u043A\u0438 \u0444\u0430\u0439\u043B\u0430 \u0438 \u043D\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C."),
|
|
108690
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u041F\u043E\u043A\u0430 \u043E\u043A\u043D\u043E \u043E\u0442\u043A\u0440\u044B\u0442\u043E, \u0430\u0432\u0442\u043E\u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u0438 \u0437\u0430\u043F\u0438\u0441\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u0432 \u044D\u0442\u0443 \u043F\u0430\u043F\u043A\u0443 \u043D\u0430 \u0414\u0438\u0441\u043A\u0435 \u043D\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u2014 \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u0444\u0430\u0439\u043B, \u043F\u043E\u043A\u0430 \u0432\u044B \u043D\u0435 \u0440\u0435\u0448\u0438\u0442\u0435, \u0435\u0441\u0442\u044C \u043B\u0438 \u0443\u0436\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438.")),
|
|
108691
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__["default"], { sx: { px: 3, pb: 2, gap: 1 } },
|
|
108692
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { onClick: handleSettingsFileMissingRetry, variant: "outlined", disabled: settingsFileMissingDialog.retrying, startIcon: settingsFileMissingDialog.retrying ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16, color: "inherit" }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_59__["default"], null) }, "\u041F\u0435\u0440\u0435\u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C"),
|
|
108693
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { onClick: handleSettingsFileMissingDismissOk, variant: "contained", disabled: settingsFileMissingDialog.retrying }, "\u044D\u0442\u043E \u043D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E"))),
|
|
108694
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PromptManagerDialog__WEBPACK_IMPORTED_MODULE_62__["default"], { open: promptManagerOpen, onClose: () => setPromptManagerOpen(false) }),
|
|
108695
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { open: settingsBackupDialogOpen, onClose: () => {
|
|
108696
|
+
setSettingsBackupDialogOpen(false);
|
|
108697
|
+
setSettingsImportBundle(null);
|
|
108698
|
+
setSettingsImportFlags(null);
|
|
108699
|
+
}, maxWidth: "md", fullWidth: true, scroll: "paper" },
|
|
108700
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { sx: {
|
|
108701
|
+
display: 'flex',
|
|
108702
|
+
alignItems: 'center',
|
|
108703
|
+
justifyContent: 'space-between',
|
|
108704
|
+
gap: 1,
|
|
108705
|
+
pr: 1
|
|
108706
|
+
} },
|
|
108707
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { component: "span", variant: "h6", sx: { fontSize: '1.1rem' } }, "\u0420\u0435\u0437\u0435\u0440\u0432\u043D\u0430\u044F \u043A\u043E\u043F\u0438\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A (\u044D\u0442\u043E \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E)"),
|
|
108708
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { "aria-label": "\u0437\u0430\u043A\u0440\u044B\u0442\u044C", onClick: () => {
|
|
108709
|
+
setSettingsBackupDialogOpen(false);
|
|
108710
|
+
setSettingsImportBundle(null);
|
|
108711
|
+
setSettingsImportFlags(null);
|
|
108712
|
+
}, size: "small" },
|
|
108713
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_48__["default"], null))),
|
|
108714
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__["default"], { dividers: true, sx: { maxHeight: { xs: '70vh', sm: '75vh' } } },
|
|
108715
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 2 } },
|
|
108716
|
+
"\u041F\u0440\u043E\u043C\u043F\u0442\u044B, \u043E\u0432\u0435\u0440\u0440\u0430\u0439\u0434\u044B, \u043F\u043E\u0434\u0445\u043E\u0434\u044B (\u0432\u043A\u043B\u044E\u0447\u0430\u044F \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u044B\u0439 \u0438 \u043F\u043E-\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0435 \u0440\u0435\u0436\u0438\u043C\u044B \u0431\u0443\u043B\u043B\u0435\u0442\u043E\u0432 \u0432\u043D\u0443\u0442\u0440\u0438 promptOverrides), \u043C\u043E\u0434\u0435\u043B\u0438; \u043F\u0440\u0438 \u043E\u0442\u043C\u0435\u0447\u0435\u043D\u043D\u044B\u0445 \u043E\u043F\u0446\u0438\u044F\u0445 \u2014 Google OAuth, \u043A\u043B\u044E\u0447 OpenRouter, \u0442\u043E\u043A\u0435\u043D\u044B. \u041A\u044D\u0448 URL \u043F\u0430\u043F\u043E\u043A Drive \u0432 \u0431\u0430\u043D\u0434\u043B \u043D\u0435 \u0432\u0445\u043E\u0434\u0438\u0442. \u041D\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u043F\u0430\u043F\u043A\u0438 \u043E\u0444\u0444\u0435\u0440\u043E\u0432 \u0438 project-settings \u043D\u0430 Google Drive. \u0424\u0430\u0439\u043B JSON: format = ",
|
|
108717
|
+
_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.SETTINGS_BUNDLE_FORMAT,
|
|
108718
|
+
", \u0432\u0435\u0440\u0441\u0438\u044F 1."),
|
|
108719
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', md: 'row' }, spacing: 3, alignItems: "flex-start" },
|
|
108720
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { flex: 1, minWidth: 260 } },
|
|
108721
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle2", sx: { mb: 1, fontWeight: 600 } }, "\u042D\u043A\u0441\u043F\u043E\u0440\u0442"),
|
|
108722
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_37__["default"], null,
|
|
108723
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.promptOverrides, onChange: e => setSettingsExportFlags(f => ({ ...f, promptOverrides: e.target.checked })) }), label: "\u041F\u0440\u043E\u043C\u043F\u0442\u044B \u0438 \u043F\u043E\u0434\u0445\u043E\u0434\u044B (\u043A\u0440\u0435\u043E, \u043F\u0430\u0440\u044B, \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u0438, \u043A\u0430\u0441\u0442\u043E\u043C\u043D\u044B\u0435 \u0442\u0435\u043A\u0441\u0442\u044B, \u0442\u0443\u043C\u0431\u043B\u0435\u0440\u044B \u0431\u0443\u043B\u043B\u0435\u0442\u043E\u0432: \u0432\u0435\u0437\u0434\u0435 / \u043F\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u0430\u043C \u2014 \u0432\u0441\u0451 \u0432 promptOverrides)" }),
|
|
108724
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.localStorageUi, onChange: e => setSettingsExportFlags(f => ({ ...f, localStorageUi: e.target.checked })) }), label: "\u041C\u043E\u0434\u0435\u043B\u0438, \u0432\u0430\u043B\u0438\u0434\u0430\u0442\u043E\u0440, \u0442\u0435\u043C\u0430, \u0441\u043E\u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u0435 \u0441\u0442\u043E\u0440\u043E\u043D" }),
|
|
108725
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.googleOAuth, onChange: e => setSettingsExportFlags(f => ({ ...f, googleOAuth: e.target.checked })) }), label: "Google Client ID / Secret (\u0438\u0437 config)" }),
|
|
108726
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.openRouterKey, onChange: e => setSettingsExportFlags(f => ({ ...f, openRouterKey: e.target.checked })) }), label: "\u041A\u043B\u044E\u0447 OpenRouter (\u0438\u0437 config; \u0445\u0440\u0430\u043D\u0438\u0442\u0435 \u0444\u0430\u0439\u043B \u0432 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438)" }),
|
|
108727
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.flexCardKey, onChange: e => setSettingsExportFlags(f => ({ ...f, flexCardKey: e.target.checked })) }), label: "\u041A\u043B\u044E\u0447 FlexCard API (\u0438\u0437 config)" }),
|
|
108728
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.googleTokens, onChange: e => setSettingsExportFlags(f => ({ ...f, googleTokens: e.target.checked })) }), label: "\u0422\u043E\u043A\u0435\u043D\u044B Google (\u0434\u043E\u0441\u0442\u0443\u043F/\u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435) \u2014 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0432\u044B\u043A\u043B., \u0440\u0438\u0441\u043A \u0443\u0442\u0435\u0447\u043A\u0438" })),
|
|
108729
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", sx: { mt: 2 }, onClick: handleSettingsExport }, "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C JSON\u2026")),
|
|
108730
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { flex: 1, minWidth: 260 } },
|
|
108731
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle2", sx: { mb: 1, fontWeight: 600 } }, "\u0418\u043C\u043F\u043E\u0440\u0442"),
|
|
108732
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", onClick: () => settingsImportFileInputRef.current?.click() }, "\u0412\u044B\u0431\u0440\u0430\u0442\u044C JSON\u2026"),
|
|
108733
|
+
settingsImportBundle && settingsImportFlags && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { mt: 2, p: 1.5, border: 1, borderColor: 'divider', borderRadius: 1 } },
|
|
108734
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", sx: { mb: 1 } },
|
|
108735
|
+
"\u0424\u0430\u0439\u043B: ",
|
|
108736
|
+
settingsImportBundle.exportedAt ? new Date(settingsImportBundle.exportedAt).toLocaleString() : '—'),
|
|
108737
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_37__["default"], null,
|
|
108738
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsImportFlags.promptOverrides, disabled: !(0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.getPresentSections)(settingsImportBundle).promptOverrides, onChange: e => setSettingsImportFlags(f => f ? { ...f, promptOverrides: e.target.checked } : f) }), label: "\u041F\u0440\u043E\u043C\u043F\u0442\u044B \u0438 \u043F\u043E\u0434\u0445\u043E\u0434\u044B" }),
|
|
108739
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsImportFlags.localStorage, disabled: !(0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.getPresentSections)(settingsImportBundle).localStorage, onChange: e => setSettingsImportFlags(f => f ? { ...f, localStorage: e.target.checked } : f) }), label: "LocalStorage (\u043C\u043E\u0434\u0435\u043B\u0438, \u0442\u0435\u043C\u0430, \u043A\u044D\u0448 \u043F\u0430\u043F\u043E\u043A, \u2026)" }),
|
|
108740
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsImportFlags.electronConfig, disabled: !(0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.getPresentSections)(settingsImportBundle).electronConfig, onChange: e => setSettingsImportFlags(f => f ? { ...f, electronConfig: e.target.checked } : f) }), label: "Config: OAuth, \u043A\u043B\u044E\u0447, \u0442\u043E\u043A\u0435\u043D\u044B (\u0435\u0441\u043B\u0438 \u0435\u0441\u0442\u044C \u0432 \u0444\u0430\u0439\u043B\u0435)" })),
|
|
108741
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, sx: { mt: 2 } },
|
|
108742
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", onClick: handleSettingsImportApply }, "\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C"),
|
|
108743
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { onClick: () => {
|
|
108744
|
+
setSettingsImportBundle(null);
|
|
108745
|
+
setSettingsImportFlags(null);
|
|
108746
|
+
} }, "\u041E\u0442\u043C\u0435\u043D\u0430"))))))),
|
|
108747
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__["default"], null,
|
|
108748
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { onClick: () => {
|
|
108749
|
+
setSettingsBackupDialogOpen(false);
|
|
108750
|
+
setSettingsImportBundle(null);
|
|
108751
|
+
setSettingsImportFlags(null);
|
|
108752
|
+
} }, "\u0417\u0430\u043A\u0440\u044B\u0442\u044C"))),
|
|
108753
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_38__["default"], { open: settingsBackupSnackbar.open, autoHideDuration: 7000, onClose: () => setSettingsBackupSnackbar(s => ({ ...s, open: false })), anchorOrigin: { vertical: 'bottom', horizontal: 'center' } },
|
|
108754
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { onClose: () => setSettingsBackupSnackbar(s => ({ ...s, open: false })), severity: settingsBackupSnackbar.severity, variant: "filled", sx: { width: '100%' } }, settingsBackupSnackbar.message)))));
|
|
107779
108755
|
}
|
|
107780
108756
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);
|
|
107781
108757
|
|
|
@@ -107814,25 +108790,28 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
107814
108790
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tab/Tab.js");
|
|
107815
108791
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tooltip/Tooltip.js");
|
|
107816
108792
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Checkbox/Checkbox.js");
|
|
107817
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
107818
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
107819
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
107820
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
107821
|
-
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/
|
|
107822
|
-
/* harmony import */ var
|
|
107823
|
-
/* harmony import */ var
|
|
107824
|
-
/* harmony import */ var
|
|
107825
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
107826
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
107827
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
107828
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
107829
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
107830
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
107831
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
107832
|
-
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/
|
|
107833
|
-
/* harmony import */ var
|
|
107834
|
-
/* harmony import */ var
|
|
107835
|
-
/* harmony import */ var
|
|
108793
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormControl/FormControl.js");
|
|
108794
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Select/Select.js");
|
|
108795
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/MenuItem/MenuItem.js");
|
|
108796
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Accordion/Accordion.js");
|
|
108797
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionSummary/AccordionSummary.js");
|
|
108798
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionDetails/AccordionDetails.js");
|
|
108799
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogActions/DialogActions.js");
|
|
108800
|
+
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Snackbar/Snackbar.js");
|
|
108801
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Cancel.js");
|
|
108802
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Close.js");
|
|
108803
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CompareArrows.js");
|
|
108804
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Edit.js");
|
|
108805
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ExpandMore.js");
|
|
108806
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/KeyboardArrowDown.js");
|
|
108807
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/KeyboardArrowUp.js");
|
|
108808
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/RestartAlt.js");
|
|
108809
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Save.js");
|
|
108810
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Search.js");
|
|
108811
|
+
/* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Settings.js");
|
|
108812
|
+
/* harmony import */ var _prompts__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./prompts */ "./src/prompts.ts");
|
|
108813
|
+
/* harmony import */ var _landingPrompts__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./landingPrompts */ "./src/landingPrompts.ts");
|
|
108814
|
+
/* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
|
|
107836
108815
|
|
|
107837
108816
|
|
|
107838
108817
|
|
|
@@ -107845,11 +108824,11 @@ function TabPanel(props) {
|
|
|
107845
108824
|
}
|
|
107846
108825
|
/** Подсказка для кнопки типа товара: списки подходов для текстов и картинок (номера как в таблицах). */
|
|
107847
108826
|
function productTypePresetTooltip(label) {
|
|
107848
|
-
const textNums =
|
|
108827
|
+
const textNums = _promptOverrides__WEBPACK_IMPORTED_MODULE_41__.PRODUCT_TYPE_TEXT_PAIR_PRESETS[label];
|
|
107849
108828
|
if (!textNums)
|
|
107850
108829
|
return label;
|
|
107851
108830
|
const sortedText = [...textNums].sort((a, b) => a - b);
|
|
107852
|
-
const imgPreset =
|
|
108831
|
+
const imgPreset = _promptOverrides__WEBPACK_IMPORTED_MODULE_41__.PRODUCT_TYPE_IMAGE_PRESETS[label];
|
|
107853
108832
|
const sortedImg = imgPreset ? [...imgPreset].sort((a, b) => a - b) : null;
|
|
107854
108833
|
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { py: 0.25, maxWidth: 380, color: 'common.white', fontSize: '0.75rem' } },
|
|
107855
108834
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", component: "div", sx: { fontWeight: 700, mb: 0.75, display: 'block', color: 'inherit' } },
|
|
@@ -107861,7 +108840,7 @@ function productTypePresetTooltip(label) {
|
|
|
107861
108840
|
n,
|
|
107862
108841
|
"."),
|
|
107863
108842
|
" ",
|
|
107864
|
-
|
|
108843
|
+
_prompts__WEBPACK_IMPORTED_MODULE_39__.PAIR_APPROACH_POOL[n - 1]?.name ?? '—')))),
|
|
107865
108844
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", component: "div", sx: { fontWeight: 700, mb: 0.75, display: 'block', color: 'inherit' } },
|
|
107866
108845
|
"\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",
|
|
107867
108846
|
sortedImg ? ` — ${sortedImg.length} подходов` : '',
|
|
@@ -107871,7 +108850,7 @@ function productTypePresetTooltip(label) {
|
|
|
107871
108850
|
n,
|
|
107872
108851
|
"."),
|
|
107873
108852
|
" ",
|
|
107874
|
-
|
|
108853
|
+
_prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES[n - 1]?.name ?? '—'))))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", sx: { display: 'block', lineHeight: 1.5, opacity: 0.85, color: 'inherit' } }, "\u0412\u0441\u0435 10 \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432 \u043F\u043E 1 \u043A\u0440\u0435\u043E (\u043D\u0435\u0442 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u0435\u0441\u0435\u0442\u0430)"))));
|
|
107875
108854
|
}
|
|
107876
108855
|
function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder, helperText, fullWidth = true, multiline = true }) {
|
|
107877
108856
|
const [searchOpen, setSearchOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
@@ -107956,7 +108935,7 @@ function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder
|
|
|
107956
108935
|
border: '1px solid',
|
|
107957
108936
|
borderColor: 'divider',
|
|
107958
108937
|
} },
|
|
107959
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108938
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_37__["default"], { sx: { fontSize: 18, color: 'text.secondary' } }),
|
|
107960
108939
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { ref: searchInputRef, value: searchQuery, onChange: (e) => { setSearchQuery(e.target.value); setCurrentMatch(0); }, onKeyDown: handleKeyDown, placeholder: "\u041F\u043E\u0438\u0441\u043A...", style: {
|
|
107961
108940
|
border: 'none',
|
|
107962
108941
|
outline: 'none',
|
|
@@ -107969,11 +108948,11 @@ function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder
|
|
|
107969
108948
|
}, autoFocus: true }),
|
|
107970
108949
|
searchQuery && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", sx: { color: 'text.secondary', whiteSpace: 'nowrap', minWidth: 50, textAlign: 'center' } }, matches.length > 0 ? `${currentMatch + 1} / ${matches.length}` : 'нет')),
|
|
107971
108950
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => navigateToMatch(currentMatch - 1), disabled: matches.length === 0, sx: { p: 0.3 } },
|
|
107972
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108951
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 18 } })),
|
|
107973
108952
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => navigateToMatch(currentMatch + 1), disabled: matches.length === 0, sx: { p: 0.3 } },
|
|
107974
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108953
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_33__["default"], { sx: { fontSize: 18 } })),
|
|
107975
108954
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => { setSearchOpen(false); setSearchQuery(''); }, sx: { p: 0.3 } },
|
|
107976
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108955
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_29__["default"], { sx: { fontSize: 18 } })))),
|
|
107977
108956
|
!searchOpen && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => { setSearchOpen(true); setTimeout(() => searchInputRef.current?.focus(), 50); }, sx: {
|
|
107978
108957
|
position: 'absolute',
|
|
107979
108958
|
top: 8,
|
|
@@ -107984,7 +108963,7 @@ function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder
|
|
|
107984
108963
|
bgcolor: 'background.paper',
|
|
107985
108964
|
boxShadow: 1,
|
|
107986
108965
|
} },
|
|
107987
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108966
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_37__["default"], { sx: { fontSize: 16 } }))),
|
|
107988
108967
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { inputRef: textareaRef, fullWidth: fullWidth, multiline: multiline, rows: rows, value: value, onChange: onChange, disabled: disabled, placeholder: placeholder, helperText: helperText, onKeyDown: handleTextareaKeyDown, sx: {
|
|
107989
108968
|
'& .MuiInputBase-input': {
|
|
107990
108969
|
fontFamily: '"SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace',
|
|
@@ -108146,7 +109125,7 @@ function DiffViewer({ oldText, newText }) {
|
|
|
108146
109125
|
border: '1px solid',
|
|
108147
109126
|
borderColor: 'divider',
|
|
108148
109127
|
} },
|
|
108149
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109128
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_37__["default"], { sx: { fontSize: 18, color: 'text.secondary' } }),
|
|
108150
109129
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { ref: searchInputRef, value: searchQuery, onChange: (e) => { setSearchQuery(e.target.value); setCurrentMatch(0); }, onKeyDown: handleSearchKeyDown, placeholder: "\u041F\u043E\u0438\u0441\u043A...", style: {
|
|
108151
109130
|
border: 'none',
|
|
108152
109131
|
outline: 'none',
|
|
@@ -108159,11 +109138,11 @@ function DiffViewer({ oldText, newText }) {
|
|
|
108159
109138
|
}, autoFocus: true }),
|
|
108160
109139
|
searchQuery && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", sx: { color: 'text.secondary', whiteSpace: 'nowrap', minWidth: 50, textAlign: 'center' } }, totalMatches > 0 ? `${currentMatch + 1} / ${totalMatches}` : 'нет')),
|
|
108161
109140
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => navigateMatch(-1), disabled: totalMatches === 0, sx: { p: 0.3 } },
|
|
108162
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109141
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 18 } })),
|
|
108163
109142
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => navigateMatch(1), disabled: totalMatches === 0, sx: { p: 0.3 } },
|
|
108164
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109143
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_33__["default"], { sx: { fontSize: 18 } })),
|
|
108165
109144
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => { setSearchOpen(false); setSearchQuery(''); }, sx: { p: 0.3 } },
|
|
108166
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109145
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_29__["default"], { sx: { fontSize: 18 } })))),
|
|
108167
109146
|
!searchOpen && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => { setSearchOpen(true); setTimeout(() => searchInputRef.current?.focus(), 50); }, sx: {
|
|
108168
109147
|
position: 'absolute',
|
|
108169
109148
|
top: 28,
|
|
@@ -108174,7 +109153,7 @@ function DiffViewer({ oldText, newText }) {
|
|
|
108174
109153
|
bgcolor: 'background.paper',
|
|
108175
109154
|
boxShadow: 1,
|
|
108176
109155
|
} },
|
|
108177
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109156
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_37__["default"], { sx: { fontSize: 16 } }))),
|
|
108178
109157
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 1, sx: { mb: 1 }, alignItems: "center" },
|
|
108179
109158
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: `+${stats.added}`, size: "small", sx: { bgcolor: '#e6ffec', color: '#1a7f37', fontWeight: 'bold', fontFamily: 'monospace' } }),
|
|
108180
109159
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: `−${stats.removed}`, size: "small", sx: { bgcolor: '#ffebe9', color: '#cf222e', fontWeight: 'bold', fontFamily: 'monospace' } })),
|
|
@@ -108243,17 +109222,17 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108243
109222
|
// selectedApproaches: array of indices from PAIR_APPROACH_POOL, ordered
|
|
108244
109223
|
const [selectedApproaches, setSelectedApproaches] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([0, 1, 2]);
|
|
108245
109224
|
// imageApproachCounts: по одному на каждый подход (CREO_APPROACHES), каждый 0–MAX_IMAGES_PER_CREO_APPROACH
|
|
108246
|
-
const [imageApproachCounts, setImageApproachCounts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => Array(
|
|
109225
|
+
const [imageApproachCounts, setImageApproachCounts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => Array(_prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES.length).fill(1));
|
|
108247
109226
|
const [creoToastOpen, setCreoToastOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
|
|
108248
109227
|
const [creoToastMessage, setCreoToastMessage] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
|
|
108249
109228
|
const creoToastDebounceRef = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null);
|
|
108250
109229
|
// Загрузить оверрайды при открытии
|
|
108251
109230
|
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
108252
109231
|
if (open) {
|
|
108253
|
-
const loaded = (0,
|
|
109232
|
+
const loaded = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.loadPromptOverrides)();
|
|
108254
109233
|
setOverrides(loaded);
|
|
108255
|
-
setSelectedApproaches((0,
|
|
108256
|
-
setImageApproachCounts((0,
|
|
109234
|
+
setSelectedApproaches((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.getSelectedPairApproaches)());
|
|
109235
|
+
setImageApproachCounts((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.getImageApproachCounts)());
|
|
108257
109236
|
setHasChanges(false);
|
|
108258
109237
|
}
|
|
108259
109238
|
}, [open]);
|
|
@@ -108291,7 +109270,7 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108291
109270
|
});
|
|
108292
109271
|
};
|
|
108293
109272
|
const handleImageApproachCountChange = (idx, count) => {
|
|
108294
|
-
const clamped = Math.max(0, Math.min(
|
|
109273
|
+
const clamped = Math.max(0, Math.min(_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.MAX_IMAGES_PER_CREO_APPROACH, count));
|
|
108295
109274
|
setImageApproachCounts(prev => {
|
|
108296
109275
|
const next = [...prev];
|
|
108297
109276
|
if (idx >= 0 && idx < next.length)
|
|
@@ -108369,15 +109348,15 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108369
109348
|
else {
|
|
108370
109349
|
console.log(debugMsg, overrides);
|
|
108371
109350
|
}
|
|
108372
|
-
(0,
|
|
108373
|
-
window.dispatchEvent(new Event(
|
|
109351
|
+
(0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.savePromptOverrides)(overrides);
|
|
109352
|
+
window.dispatchEvent(new Event(_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.PROMPT_OVERRIDES_SAVED_EVENT));
|
|
108374
109353
|
setHasChanges(false);
|
|
108375
109354
|
onClose();
|
|
108376
109355
|
};
|
|
108377
109356
|
const handleCancel = () => {
|
|
108378
109357
|
if (hasChanges) {
|
|
108379
109358
|
if (window.confirm('Есть несохраненные изменения. Закрыть без сохранения?')) {
|
|
108380
|
-
setOverrides((0,
|
|
109359
|
+
setOverrides((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.loadPromptOverrides)());
|
|
108381
109360
|
setHasChanges(false);
|
|
108382
109361
|
onClose();
|
|
108383
109362
|
}
|
|
@@ -108391,23 +109370,23 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108391
109370
|
const getOriginalPrompt = (promptName) => {
|
|
108392
109371
|
switch (promptName) {
|
|
108393
109372
|
case 'getPairsSystemPrompt':
|
|
108394
|
-
return (0,
|
|
109373
|
+
return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getPairsSystemPrompt)('${geo}', true, selectedApproaches.length, selectedApproaches);
|
|
108395
109374
|
case 'getPairsUserPrompt':
|
|
108396
|
-
return (0,
|
|
109375
|
+
return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getPairsUserPrompt)('${product}', '${geo}', '${additionalInfo}', true, selectedApproaches.length, selectedApproaches);
|
|
108397
109376
|
case 'getTitlesSystemPrompt':
|
|
108398
|
-
return (0,
|
|
109377
|
+
return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getTitlesSystemPrompt)('${geo}', true, selectedApproaches.length);
|
|
108399
109378
|
case 'getTextsSystemPrompt':
|
|
108400
|
-
return (0,
|
|
109379
|
+
return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getTextsSystemPrompt)('${geo}', true, selectedApproaches.length);
|
|
108401
109380
|
case 'getUserPrompt':
|
|
108402
|
-
return (0,
|
|
109381
|
+
return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getUserPrompt)('${product}', '${geo}', '${additionalInfo}', 'titles', true, selectedApproaches.length);
|
|
108403
109382
|
case 'getValidationPrompt':
|
|
108404
|
-
return (0,
|
|
109383
|
+
return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getValidationPrompt)('${product}', '${geo}', ['keyword1', 'keyword2'], '${approachName}', true, 'Новая по брифу: 29 EUR; старая (2×): 58 EUR — в рантайме подставляется из поля цены; в кастомном промпте плейсхолдер ${priceBrief}', { expectNoBullets: true });
|
|
108405
109384
|
case 'getImageGenerationBasePrompt':
|
|
108406
|
-
return (0,
|
|
109385
|
+
return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getImageGenerationBasePrompt)('${generateGeo}', '${generatePrice}', '${generateCurrency}', true);
|
|
108407
109386
|
case 'getLandingPageSystemPrompt':
|
|
108408
|
-
return (0,
|
|
109387
|
+
return (0,_landingPrompts__WEBPACK_IMPORTED_MODULE_40__.getLandingPageSystemPrompt)(true);
|
|
108409
109388
|
case 'getLandingPageUserPrompt':
|
|
108410
|
-
return (0,
|
|
109389
|
+
return (0,_landingPrompts__WEBPACK_IMPORTED_MODULE_40__.getLandingPageUserPrompt)('${product}', '${geo}', true);
|
|
108411
109390
|
default:
|
|
108412
109391
|
return '';
|
|
108413
109392
|
}
|
|
@@ -108429,18 +109408,18 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108429
109408
|
enabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
|
|
108430
109409
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", value: viewMode, exclusive: true, onChange: (_, val) => val && setViewModes(prev => ({ ...prev, [viewModeKey]: val })) },
|
|
108431
109410
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "edit" },
|
|
108432
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109411
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_31__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
|
|
108433
109412
|
" \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440"),
|
|
108434
109413
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "diff" },
|
|
108435
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109414
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_30__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
|
|
108436
109415
|
" Diff")),
|
|
108437
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { size: "small", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109416
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { size: "small", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_35__["default"], null), onClick: () => handleResetPrompt(promptName) }, "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C")))),
|
|
108438
109417
|
description && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 1 } }, description)),
|
|
108439
109418
|
enabled && viewMode === 'diff' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DiffViewer, { oldText: originalPrompt, newText: customPrompt })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SearchableTextField, { rows: 15, value: displayPrompt, onChange: (e) => handlePromptChange(promptName, e.target.value), disabled: !enabled, placeholder: enabled ? 'Введите кастомный промпт' : 'Включите переключатель для редактирования', helperText: !enabled ? 'Это оригинальный промпт. Включите переключатель выше для редактирования.' : undefined }))));
|
|
108440
109419
|
};
|
|
108441
109420
|
// Управление подходами для изображений
|
|
108442
109421
|
const handleApproachToggle = (approachName, enabled) => {
|
|
108443
|
-
const originalApproach =
|
|
109422
|
+
const originalApproach = _prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES.find(a => a.name === approachName);
|
|
108444
109423
|
if (!originalApproach)
|
|
108445
109424
|
return;
|
|
108446
109425
|
setOverrides(prev => {
|
|
@@ -108490,7 +109469,7 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108490
109469
|
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { open: open, onClose: handleCancel, maxWidth: "lg", fullWidth: true },
|
|
108491
109470
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__["default"], null,
|
|
108492
109471
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center" },
|
|
108493
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109472
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_38__["default"], null),
|
|
108494
109473
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "h6" }, "\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u043C\u043F\u0442\u0430\u043C\u0438"),
|
|
108495
109474
|
hasChanges && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: "\u0415\u0441\u0442\u044C \u043D\u0435\u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043D\u044B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F", color: "warning", size: "small" })))),
|
|
108496
109475
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["default"], null,
|
|
@@ -108506,7 +109485,7 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108506
109485
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: `Выбрано: ${selectedApproaches.length}`, color: "primary", size: "small" }),
|
|
108507
109486
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", color: "text.secondary" }, "(\u043C\u0438\u043D\u0438\u043C\u0443\u043C 2, \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C 10)")),
|
|
108508
109487
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", color: "text.secondary", sx: { display: 'block', mb: 0.75 } }, "\u0422\u0438\u043F \u0442\u043E\u0432\u0430\u0440\u0430 \u2014 \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u043D\u0430\u0431\u043E\u0440 \u043F\u0430\u0440 \u0442\u0435\u043A\u0441\u0442\u043E\u0432 \u0438 \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432 \u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\u043C (1\u201310 = \u2116 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u043A\u0430\u0436\u0434\u043E\u0439 \u0442\u0430\u0431\u043B\u0438\u0446\u0435):"),
|
|
108509
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", flexWrap: "wrap", gap: 0.75, sx: { mb: 1.5 } }, Object.entries(
|
|
109488
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", flexWrap: "wrap", gap: 0.75, sx: { mb: 1.5 } }, Object.entries(_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.PRODUCT_TYPE_TEXT_PAIR_PRESETS).map(([label, nums]) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { key: label, title: productTypePresetTooltip(label), placement: "top", arrow: true, enterDelay: 200, componentsProps: {
|
|
108510
109489
|
tooltip: {
|
|
108511
109490
|
sx: {
|
|
108512
109491
|
maxWidth: 420,
|
|
@@ -108519,13 +109498,13 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108519
109498
|
},
|
|
108520
109499
|
} },
|
|
108521
109500
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { size: "small", variant: "outlined", color: "inherit", sx: { textTransform: 'none', fontSize: '0.8rem' }, onClick: () => {
|
|
108522
|
-
const next = (0,
|
|
109501
|
+
const next = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.productPresetNumbersToIndices)(nums);
|
|
108523
109502
|
if (next.length < 2)
|
|
108524
109503
|
return;
|
|
108525
|
-
const imgNums =
|
|
109504
|
+
const imgNums = _promptOverrides__WEBPACK_IMPORTED_MODULE_41__.PRODUCT_TYPE_IMAGE_PRESETS[label];
|
|
108526
109505
|
const nextImageCounts = imgNums
|
|
108527
|
-
? (0,
|
|
108528
|
-
: Array(
|
|
109506
|
+
? (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.productPresetNumbersToImageCounts)(imgNums)
|
|
109507
|
+
: Array(_prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES.length).fill(1);
|
|
108529
109508
|
setSelectedApproaches(next);
|
|
108530
109509
|
setImageApproachCounts(nextImageCounts);
|
|
108531
109510
|
setOverrides(o => ({
|
|
@@ -108545,7 +109524,7 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108545
109524
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc', whiteSpace: 'nowrap', width: 140 } }, "\u0423\u0433\u043E\u043B"),
|
|
108546
109525
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc' } }, "\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A"),
|
|
108547
109526
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc' } }, "\u0422\u0435\u043A\u0441\u0442"))),
|
|
108548
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null,
|
|
109527
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null, _prompts__WEBPACK_IMPORTED_MODULE_39__.PAIR_APPROACH_POOL.map((p, i) => {
|
|
108549
109528
|
const checked = selectedApproaches.includes(i);
|
|
108550
109529
|
const isLast = checked && selectedApproaches.length <= 2;
|
|
108551
109530
|
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tr", { key: i, onClick: () => handlePairApproachToggle(i), style: {
|
|
@@ -108563,22 +109542,39 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108563
109542
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', color: '#777' } }, p.textApproach.split('\n')[0])));
|
|
108564
109543
|
}))))),
|
|
108565
109544
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { mb: 3, p: 2, border: '1px solid', borderColor: 'divider', borderRadius: 1 } },
|
|
108566
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mb: 1.5 } },
|
|
109545
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mb: 1.5, flexWrap: 'wrap' } },
|
|
108567
109546
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle1", sx: { fontWeight: 600 } }, "\u041F\u043E\u0434\u0445\u043E\u0434\u044B \u0434\u043B\u044F \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439"),
|
|
108568
109547
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: `Всего: ${imageApproachCounts.reduce((a, b) => a + b, 0)}`, color: "primary", size: "small" }),
|
|
108569
109548
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", color: "text.secondary" },
|
|
108570
109549
|
"(0\u2013",
|
|
108571
|
-
|
|
109550
|
+
_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.MAX_IMAGES_PER_CREO_APPROACH,
|
|
108572
109551
|
" \u043D\u0430 \u043A\u0430\u0436\u0434\u044B\u0439 \u043F\u043E\u0434\u0445\u043E\u0434)")),
|
|
109552
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { sx: { mb: 1.5, display: 'flex' }, control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "small", checked: Boolean(overrides.imageBulletsGlobalOff), onChange: (_, c) => {
|
|
109553
|
+
setOverrides(o => {
|
|
109554
|
+
const n = { ...o };
|
|
109555
|
+
if (c)
|
|
109556
|
+
n.imageBulletsGlobalOff = true;
|
|
109557
|
+
else
|
|
109558
|
+
delete n.imageBulletsGlobalOff;
|
|
109559
|
+
return n;
|
|
109560
|
+
});
|
|
109561
|
+
setHasChanges(true);
|
|
109562
|
+
} }), label: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], null,
|
|
109563
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "body2" }, "\u0412\u0435\u0437\u0434\u0435 \u0431\u0435\u0437 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0431\u0443\u043B\u043B\u0435\u0442\u043E\u0432"),
|
|
109564
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", color: "text.secondary", display: "block" }, "\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044E \u0438 \u0432\u0430\u043B\u0438\u0434\u0430\u0442\u043E\u0440. \u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u0432 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F, \u043D\u0435 \u0432 \u043F\u0430\u043F\u043A\u0443 \u043E\u0444\u0444\u0435\u0440\u0430. \u041F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u00AB\u0432\u043A\u043B.\u00BB \u0432 \u0441\u0442\u0440\u043E\u043A\u0435.")) }),
|
|
108573
109565
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { overflowX: 'auto' } },
|
|
108574
109566
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("table", { style: { width: '100%', borderCollapse: 'collapse', fontSize: 12 } },
|
|
108575
109567
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("thead", null,
|
|
108576
109568
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tr", null,
|
|
108577
109569
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'center', padding: '4px 8px', borderBottom: '1px solid #ccc', width: 70 } }, "\u041A\u043E\u043B-\u0432\u043E"),
|
|
108578
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc', whiteSpace: 'nowrap',
|
|
109570
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc', whiteSpace: 'nowrap', maxWidth: 200 } }, "\u041F\u043E\u0434\u0445\u043E\u0434"),
|
|
109571
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc', minWidth: 200 } },
|
|
109572
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { title: "\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E = \u043A\u0430\u043A \u0432 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F. \u00AB\u0412\u043A\u043B.\u00BB \u0441 \u0431\u0443\u043B\u043B\u0435\u0442\u0430\u043C\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u044B\u0439 \u0442\u0443\u043C\u0431\u043B\u0435\u0440 \u0432\u044B\u0448\u0435 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D.", arrow: true, placement: "top" },
|
|
109573
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0411\u0443\u043B\u043B\u0435\u0442\u044B"))),
|
|
108579
109574
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc' } }, "\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435"))),
|
|
108580
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null,
|
|
109575
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null, _prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES.map((approach, i) => {
|
|
108581
109576
|
const count = imageApproachCounts[i] ?? 0;
|
|
109577
|
+
const mode = overrides.imageApproachNoBulletsMode?.[approach.name] ?? 'default';
|
|
108582
109578
|
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tr", { key: i, style: { opacity: count > 0 ? 1 : 0.6 } },
|
|
108583
109579
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { textAlign: 'center', padding: '2px 8px', verticalAlign: 'middle' } },
|
|
108584
109580
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { type: "number", size: "small", value: count, onChange: (e) => {
|
|
@@ -108586,13 +109582,35 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108586
109582
|
handleImageApproachCountChange(i, isNaN(v) ? 0 : v);
|
|
108587
109583
|
}, onBlur: handleImageCountBlur, inputProps: {
|
|
108588
109584
|
min: 0,
|
|
108589
|
-
max:
|
|
109585
|
+
max: _promptOverrides__WEBPACK_IMPORTED_MODULE_41__.MAX_IMAGES_PER_CREO_APPROACH,
|
|
108590
109586
|
step: 1,
|
|
108591
109587
|
onWheel: (e) => {
|
|
108592
109588
|
e.preventDefault();
|
|
108593
109589
|
},
|
|
108594
109590
|
}, sx: { width: 56, '& .MuiInputBase-input': { textAlign: 'center', py: 0.5 } } })),
|
|
108595
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', fontWeight: 500, whiteSpace: '
|
|
109591
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', fontWeight: 500, whiteSpace: 'normal' } }, approach.name),
|
|
109592
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', verticalAlign: 'middle' } },
|
|
109593
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { size: "small", sx: { minWidth: 168 } },
|
|
109594
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { value: mode, onChange: e => {
|
|
109595
|
+
const v = e.target.value;
|
|
109596
|
+
setOverrides(o => {
|
|
109597
|
+
const m = { ...(o.imageApproachNoBulletsMode || {}) };
|
|
109598
|
+
if (v === 'default') {
|
|
109599
|
+
delete m[approach.name];
|
|
109600
|
+
}
|
|
109601
|
+
else {
|
|
109602
|
+
m[approach.name] = v;
|
|
109603
|
+
}
|
|
109604
|
+
return {
|
|
109605
|
+
...o,
|
|
109606
|
+
imageApproachNoBulletsMode: Object.keys(m).length > 0 ? m : undefined,
|
|
109607
|
+
};
|
|
109608
|
+
});
|
|
109609
|
+
setHasChanges(true);
|
|
109610
|
+
} },
|
|
109611
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { value: "default" }, "\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E"),
|
|
109612
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { value: "off" }, "\u0412\u044B\u043A\u043B. (0 \u0431\u0443\u043B\u043B\u0435\u0442\u043E\u0432)"),
|
|
109613
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { value: "on" }, "\u0412\u043A\u043B. (3 \u0432\u044B\u0433\u043E\u0434\u044B)")))),
|
|
108596
109614
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', color: '#777' } }, approach.prompt.split('\n')[0])));
|
|
108597
109615
|
}))))),
|
|
108598
109616
|
renderPromptEditor('getPairsSystemPrompt', 'Системный промпт (пары заголовок + текст)', 'Единый системный промпт, генерирующий все пары одним запросом. Переменные: ${geo}, ${count}, ${n}'),
|
|
@@ -108600,29 +109618,29 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108600
109618
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TabPanel, { value: tabValue, index: 1 },
|
|
108601
109619
|
renderPromptEditor('getImageGenerationBasePrompt', 'Базовый промпт для изображений', 'Базовый промпт, используемый для всех подходов'),
|
|
108602
109620
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "h6", sx: { mt: 3, mb: 2 } }, "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432 \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u043A\u0440\u0435\u0430\u0442\u0438\u0432\u043E\u0432"),
|
|
108603
|
-
|
|
109621
|
+
_prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES.map((approach) => {
|
|
108604
109622
|
const override = overrides.creoApproaches?.[approach.name];
|
|
108605
109623
|
const enabled = override?.enabled || false;
|
|
108606
109624
|
const approachViewKey = `approach_${approach.name}`;
|
|
108607
109625
|
const approachViewMode = viewModes[approachViewKey] || 'edit';
|
|
108608
|
-
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108609
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109626
|
+
return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { key: approach.name, sx: { mb: 2 } },
|
|
109627
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { expandIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_32__["default"], null) },
|
|
108610
109628
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { width: '100%', mr: 2 } },
|
|
108611
109629
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle1" }, approach.name),
|
|
108612
109630
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: enabled ? 'Кастомный' : 'Оригинал', color: enabled ? 'primary' : 'default', size: "small" }),
|
|
108613
|
-
enabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { size: "small", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109631
|
+
enabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { size: "small", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_35__["default"], null), onClick: (e) => {
|
|
108614
109632
|
e.stopPropagation();
|
|
108615
109633
|
handleResetApproach(approach.name);
|
|
108616
109634
|
} }, "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C")))),
|
|
108617
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109635
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], null,
|
|
108618
109636
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mb: 2 } },
|
|
108619
109637
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { checked: enabled, onChange: (e) => handleApproachToggle(approach.name, e.target.checked) }), label: "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u0430\u0441\u0442\u043E\u043C\u043D\u044B\u0439 \u043F\u043E\u0434\u0445\u043E\u0434" }),
|
|
108620
109638
|
enabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", value: approachViewMode, exclusive: true, onChange: (_, val) => val && setViewModes(prev => ({ ...prev, [approachViewKey]: val })) },
|
|
108621
109639
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "edit" },
|
|
108622
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109640
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_31__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
|
|
108623
109641
|
" \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440"),
|
|
108624
109642
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "diff" },
|
|
108625
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109643
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_30__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
|
|
108626
109644
|
" Diff")))),
|
|
108627
109645
|
enabled && approachViewMode === 'diff' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], null,
|
|
108628
109646
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle2", sx: { mb: 1 } }, "\u041F\u0440\u043E\u043C\u043F\u0442 \u043F\u043E\u0434\u0445\u043E\u0434\u0430"),
|
|
@@ -108645,10 +109663,300 @@ function PromptManagerDialog({ open, onClose }) {
|
|
|
108645
109663
|
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TabPanel, { value: tabValue, index: 3 },
|
|
108646
109664
|
renderPromptEditor('getLandingPageSystemPrompt', 'Промпт лендинга (System)', 'Системный промпт для генерации лендинг-страниц'),
|
|
108647
109665
|
renderPromptEditor('getLandingPageUserPrompt', 'Промпт лендинга (User)', 'Пользовательский промпт для генерации лендинг-страниц'))),
|
|
108648
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108649
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { onClick: handleCancel, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108650
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { onClick: handleSave, variant: "contained", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
108651
|
-
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(
|
|
109666
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], null,
|
|
109667
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { onClick: handleCancel, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_28__["default"], null) }, "\u041E\u0442\u043C\u0435\u043D\u0430"),
|
|
109668
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { onClick: handleSave, variant: "contained", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_36__["default"], null), disabled: !hasChanges }, "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C")),
|
|
109669
|
+
react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], { open: creoToastOpen, autoHideDuration: 3000, onClose: () => setCreoToastOpen(false), message: creoToastMessage, anchorOrigin: { vertical: 'bottom', horizontal: 'center' } })));
|
|
109670
|
+
}
|
|
109671
|
+
|
|
109672
|
+
|
|
109673
|
+
/***/ }),
|
|
109674
|
+
|
|
109675
|
+
/***/ "./src/appSettingsBundle.ts":
|
|
109676
|
+
/*!**********************************!*\
|
|
109677
|
+
!*** ./src/appSettingsBundle.ts ***!
|
|
109678
|
+
\**********************************/
|
|
109679
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
109680
|
+
|
|
109681
|
+
"use strict";
|
|
109682
|
+
__webpack_require__.r(__webpack_exports__);
|
|
109683
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
109684
|
+
/* harmony export */ CURRENT_SETTINGS_BUNDLE_VERSION: () => (/* binding */ CURRENT_SETTINGS_BUNDLE_VERSION),
|
|
109685
|
+
/* harmony export */ DEFAULT_EXPORT_FLAGS: () => (/* binding */ DEFAULT_EXPORT_FLAGS),
|
|
109686
|
+
/* harmony export */ LOCAL_STORAGE_UI_KEYS: () => (/* binding */ LOCAL_STORAGE_UI_KEYS),
|
|
109687
|
+
/* harmony export */ SETTINGS_BUNDLE_FORMAT: () => (/* binding */ SETTINGS_BUNDLE_FORMAT),
|
|
109688
|
+
/* harmony export */ applyLocalStorageFromBundle: () => (/* binding */ applyLocalStorageFromBundle),
|
|
109689
|
+
/* harmony export */ applyPromptOverridesFromBundle: () => (/* binding */ applyPromptOverridesFromBundle),
|
|
109690
|
+
/* harmony export */ buildSettingsBundle: () => (/* binding */ buildSettingsBundle),
|
|
109691
|
+
/* harmony export */ getPresentSections: () => (/* binding */ getPresentSections),
|
|
109692
|
+
/* harmony export */ mergeElectronImport: () => (/* binding */ mergeElectronImport),
|
|
109693
|
+
/* harmony export */ parseSettingsBundleJson: () => (/* binding */ parseSettingsBundleJson),
|
|
109694
|
+
/* harmony export */ serializeBundle: () => (/* binding */ serializeBundle)
|
|
109695
|
+
/* harmony export */ });
|
|
109696
|
+
/* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
|
|
109697
|
+
/**
|
|
109698
|
+
* Экспорт / импорт локальных настроек (localStorage, promptOverrides, фрагменты config.json Electron).
|
|
109699
|
+
* Не включает данные офферов на Google Drive.
|
|
109700
|
+
*/
|
|
109701
|
+
|
|
109702
|
+
const SETTINGS_BUNDLE_FORMAT = 'docs-combiner-settings';
|
|
109703
|
+
const CURRENT_SETTINGS_BUNDLE_VERSION = 1;
|
|
109704
|
+
/** Ключи localStorage: UI + модели + валидатор (без кэша Drive) */
|
|
109705
|
+
const LOCAL_STORAGE_UI_KEYS = [
|
|
109706
|
+
'themeMode',
|
|
109707
|
+
'selectedImageModelSquare',
|
|
109708
|
+
'selectedImageModelRect',
|
|
109709
|
+
'selectedImageModel',
|
|
109710
|
+
'selectedValidationModel',
|
|
109711
|
+
'selectedContentModel',
|
|
109712
|
+
'selectedLandingModel',
|
|
109713
|
+
'validationDisabled',
|
|
109714
|
+
'autoRemakeOnValidatorError',
|
|
109715
|
+
'uploadAfterValidatorOk',
|
|
109716
|
+
'imageAspectRatio',
|
|
109717
|
+
];
|
|
109718
|
+
const DEFAULT_EXPORT_FLAGS = {
|
|
109719
|
+
promptOverrides: true,
|
|
109720
|
+
localStorageUi: true,
|
|
109721
|
+
googleOAuth: false,
|
|
109722
|
+
openRouterKey: false,
|
|
109723
|
+
flexCardKey: false,
|
|
109724
|
+
googleTokens: false,
|
|
109725
|
+
};
|
|
109726
|
+
function collectLocalStorageKeys(keys) {
|
|
109727
|
+
const out = {};
|
|
109728
|
+
for (const k of keys) {
|
|
109729
|
+
try {
|
|
109730
|
+
const v = localStorage.getItem(k);
|
|
109731
|
+
if (v !== null)
|
|
109732
|
+
out[k] = v;
|
|
109733
|
+
}
|
|
109734
|
+
catch {
|
|
109735
|
+
// ignore
|
|
109736
|
+
}
|
|
109737
|
+
}
|
|
109738
|
+
return out;
|
|
109739
|
+
}
|
|
109740
|
+
/**
|
|
109741
|
+
* Собрать бандл для сохранения в JSON.
|
|
109742
|
+
* `fullElectronConfig` — результат `loadConfig()` в Electron, иначе null (секции из config не попадут).
|
|
109743
|
+
*/
|
|
109744
|
+
function buildSettingsBundle(flags, fullElectronConfig) {
|
|
109745
|
+
const bundle = {
|
|
109746
|
+
format: SETTINGS_BUNDLE_FORMAT,
|
|
109747
|
+
version: 1,
|
|
109748
|
+
exportedAt: new Date().toISOString(),
|
|
109749
|
+
};
|
|
109750
|
+
if (flags.promptOverrides) {
|
|
109751
|
+
try {
|
|
109752
|
+
bundle.promptOverrides = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.loadPromptOverrides)();
|
|
109753
|
+
}
|
|
109754
|
+
catch {
|
|
109755
|
+
// ignore
|
|
109756
|
+
}
|
|
109757
|
+
}
|
|
109758
|
+
const ls = {};
|
|
109759
|
+
if (flags.localStorageUi) {
|
|
109760
|
+
Object.assign(ls, collectLocalStorageKeys(LOCAL_STORAGE_UI_KEYS));
|
|
109761
|
+
}
|
|
109762
|
+
if (Object.keys(ls).length)
|
|
109763
|
+
bundle.localStorage = ls;
|
|
109764
|
+
if (fullElectronConfig && typeof fullElectronConfig === 'object') {
|
|
109765
|
+
const ec = {};
|
|
109766
|
+
if (flags.googleOAuth) {
|
|
109767
|
+
if (typeof fullElectronConfig.clientId === 'string')
|
|
109768
|
+
ec.clientId = fullElectronConfig.clientId;
|
|
109769
|
+
if (typeof fullElectronConfig.clientSecret === 'string')
|
|
109770
|
+
ec.clientSecret = fullElectronConfig.clientSecret;
|
|
109771
|
+
}
|
|
109772
|
+
if (flags.openRouterKey && typeof fullElectronConfig.openaiApiKey === 'string') {
|
|
109773
|
+
ec.openaiApiKey = fullElectronConfig.openaiApiKey;
|
|
109774
|
+
}
|
|
109775
|
+
if (flags.flexCardKey && typeof fullElectronConfig.flexcardApiKey === 'string') {
|
|
109776
|
+
ec.flexcardApiKey = fullElectronConfig.flexcardApiKey;
|
|
109777
|
+
}
|
|
109778
|
+
if (flags.googleTokens) {
|
|
109779
|
+
if (typeof fullElectronConfig.accessToken === 'string')
|
|
109780
|
+
ec.accessToken = fullElectronConfig.accessToken;
|
|
109781
|
+
if (typeof fullElectronConfig.refreshToken === 'string')
|
|
109782
|
+
ec.refreshToken = fullElectronConfig.refreshToken;
|
|
109783
|
+
}
|
|
109784
|
+
if (Object.keys(ec).length)
|
|
109785
|
+
bundle.electronConfig = ec;
|
|
109786
|
+
}
|
|
109787
|
+
return bundle;
|
|
109788
|
+
}
|
|
109789
|
+
function serializeBundle(bundle) {
|
|
109790
|
+
return JSON.stringify(bundle, null, 2);
|
|
109791
|
+
}
|
|
109792
|
+
function parseSettingsBundleJson(text) {
|
|
109793
|
+
let data;
|
|
109794
|
+
try {
|
|
109795
|
+
data = JSON.parse(text);
|
|
109796
|
+
}
|
|
109797
|
+
catch (e) {
|
|
109798
|
+
throw new Error('Файл не является корректным JSON');
|
|
109799
|
+
}
|
|
109800
|
+
if (!data || typeof data !== 'object')
|
|
109801
|
+
throw new Error('Некорректная структура файла');
|
|
109802
|
+
const o = data;
|
|
109803
|
+
if (o.format !== SETTINGS_BUNDLE_FORMAT) {
|
|
109804
|
+
throw new Error('Не файл настроек Docs Combiner (неверный format)');
|
|
109805
|
+
}
|
|
109806
|
+
if (o.version !== 1) {
|
|
109807
|
+
throw new Error(`Версия бандла ${String(o.version)} не поддерживается (ожидается 1)`);
|
|
109808
|
+
}
|
|
109809
|
+
return o;
|
|
109810
|
+
}
|
|
109811
|
+
/** Какие блоки реально есть в бандле — для чекбоксов импорта */
|
|
109812
|
+
function getPresentSections(bundle) {
|
|
109813
|
+
return {
|
|
109814
|
+
promptOverrides: bundle.promptOverrides != null && Object.keys(bundle.promptOverrides).length > 0,
|
|
109815
|
+
localStorage: bundle.localStorage != null && Object.keys(bundle.localStorage).length > 0,
|
|
109816
|
+
electronConfig: bundle.electronConfig != null && Object.keys(bundle.electronConfig).length > 0,
|
|
109817
|
+
};
|
|
109818
|
+
}
|
|
109819
|
+
/**
|
|
109820
|
+
* Импортирует настройки. Возвращает, что сделать с React (вызвать из App).
|
|
109821
|
+
*/
|
|
109822
|
+
function applyLocalStorageFromBundle(bundle, importLocal) {
|
|
109823
|
+
if (!importLocal || !bundle.localStorage)
|
|
109824
|
+
return { keysWritten: [] };
|
|
109825
|
+
const keysWritten = [];
|
|
109826
|
+
let themeMode;
|
|
109827
|
+
for (const [k, v] of Object.entries(bundle.localStorage)) {
|
|
109828
|
+
try {
|
|
109829
|
+
localStorage.setItem(k, v);
|
|
109830
|
+
keysWritten.push(k);
|
|
109831
|
+
if (k === 'themeMode' && (v === 'dark' || v === 'light'))
|
|
109832
|
+
themeMode = v;
|
|
109833
|
+
}
|
|
109834
|
+
catch {
|
|
109835
|
+
// ignore
|
|
109836
|
+
}
|
|
109837
|
+
}
|
|
109838
|
+
return { keysWritten, themeMode };
|
|
109839
|
+
}
|
|
109840
|
+
/**
|
|
109841
|
+
* `savePromptOverrides` + событие синхронизации. Имеет смысл вызывать после `applyLocalStorageFromBundle`, чтобы перезаписать сырой ключ `promptOverrides` в localStorage, если он был в файле.
|
|
109842
|
+
*/
|
|
109843
|
+
function applyPromptOverridesFromBundle(bundle, on) {
|
|
109844
|
+
if (!on || !bundle.promptOverrides)
|
|
109845
|
+
return;
|
|
109846
|
+
(0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.savePromptOverrides)(bundle.promptOverrides);
|
|
109847
|
+
try {
|
|
109848
|
+
window.dispatchEvent(new Event(_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.PROMPT_OVERRIDES_SAVED_EVENT));
|
|
109849
|
+
}
|
|
109850
|
+
catch {
|
|
109851
|
+
// ignore
|
|
109852
|
+
}
|
|
109853
|
+
}
|
|
109854
|
+
/**
|
|
109855
|
+
* Слияние electron-конфига. Только перечисленные поля из `bundle.electronConfig`, остальное в `current` не трогаем.
|
|
109856
|
+
*/
|
|
109857
|
+
function mergeElectronImport(current, bundle, on) {
|
|
109858
|
+
if (!on || !bundle.electronConfig)
|
|
109859
|
+
return current;
|
|
109860
|
+
const next = { ...current };
|
|
109861
|
+
const ec = bundle.electronConfig;
|
|
109862
|
+
[
|
|
109863
|
+
'clientId',
|
|
109864
|
+
'clientSecret',
|
|
109865
|
+
'openaiApiKey',
|
|
109866
|
+
'flexcardApiKey',
|
|
109867
|
+
'telegramBotToken',
|
|
109868
|
+
'telegramChatId',
|
|
109869
|
+
'accessToken',
|
|
109870
|
+
'refreshToken',
|
|
109871
|
+
].forEach(f => {
|
|
109872
|
+
if (ec[f] !== undefined)
|
|
109873
|
+
next[f] = ec[f];
|
|
109874
|
+
});
|
|
109875
|
+
return next;
|
|
109876
|
+
}
|
|
109877
|
+
|
|
109878
|
+
|
|
109879
|
+
/***/ }),
|
|
109880
|
+
|
|
109881
|
+
/***/ "./src/flexcardBalance.ts":
|
|
109882
|
+
/*!********************************!*\
|
|
109883
|
+
!*** ./src/flexcardBalance.ts ***!
|
|
109884
|
+
\********************************/
|
|
109885
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
109886
|
+
|
|
109887
|
+
"use strict";
|
|
109888
|
+
__webpack_require__.r(__webpack_exports__);
|
|
109889
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
109890
|
+
/* harmony export */ FLEXCARD_FINANCE_ACCOUNTS_URL: () => (/* binding */ FLEXCARD_FINANCE_ACCOUNTS_URL),
|
|
109891
|
+
/* harmony export */ fetchFlexCardFinanceAccountsUsdTotal: () => (/* binding */ fetchFlexCardFinanceAccountsUsdTotal)
|
|
109892
|
+
/* harmony export */ });
|
|
109893
|
+
/**
|
|
109894
|
+
* FlexCard — `GET /api/v1/finance/accounts/` с `X-API-Key`.
|
|
109895
|
+
* Суммируем только поле `balance` (строка или число) по строкам с `currency` === USD.
|
|
109896
|
+
*/
|
|
109897
|
+
const FLEXCARD_FINANCE_ACCOUNTS_URL = 'https://flexcard.cards/api/v1/finance/accounts/';
|
|
109898
|
+
function num(v) {
|
|
109899
|
+
if (typeof v === 'number' && !Number.isNaN(v))
|
|
109900
|
+
return v;
|
|
109901
|
+
const n = parseFloat(String(v));
|
|
109902
|
+
return Number.isFinite(n) ? n : 0;
|
|
109903
|
+
}
|
|
109904
|
+
async function fetchPaginatedResults(apiKey, initialUrl) {
|
|
109905
|
+
const trimmed = apiKey.trim();
|
|
109906
|
+
const out = [];
|
|
109907
|
+
let url = initialUrl;
|
|
109908
|
+
for (let page = 0; page < 50 && url; page++) {
|
|
109909
|
+
const res = await fetch(url, {
|
|
109910
|
+
method: 'GET',
|
|
109911
|
+
headers: {
|
|
109912
|
+
'X-API-Key': trimmed,
|
|
109913
|
+
Accept: 'application/json',
|
|
109914
|
+
},
|
|
109915
|
+
});
|
|
109916
|
+
if (!res.ok)
|
|
109917
|
+
return null;
|
|
109918
|
+
const data = (await res.json());
|
|
109919
|
+
let batch;
|
|
109920
|
+
let next;
|
|
109921
|
+
if (Array.isArray(data)) {
|
|
109922
|
+
batch = data;
|
|
109923
|
+
next = null;
|
|
109924
|
+
}
|
|
109925
|
+
else if (data && typeof data === 'object') {
|
|
109926
|
+
const o = data;
|
|
109927
|
+
const r = o.results;
|
|
109928
|
+
batch = Array.isArray(r) ? r : [];
|
|
109929
|
+
next = o.next ?? null;
|
|
109930
|
+
if (!Array.isArray(r))
|
|
109931
|
+
return null;
|
|
109932
|
+
}
|
|
109933
|
+
else {
|
|
109934
|
+
return null;
|
|
109935
|
+
}
|
|
109936
|
+
out.push(...batch);
|
|
109937
|
+
url = next ?? null;
|
|
109938
|
+
}
|
|
109939
|
+
return out;
|
|
109940
|
+
}
|
|
109941
|
+
/** Сумма `balance` по всем счетам с валютой USD. */
|
|
109942
|
+
async function fetchFlexCardFinanceAccountsUsdTotal(apiKey) {
|
|
109943
|
+
const trimmed = apiKey.trim();
|
|
109944
|
+
if (!trimmed)
|
|
109945
|
+
return null;
|
|
109946
|
+
const rows = await fetchPaginatedResults(trimmed, FLEXCARD_FINANCE_ACCOUNTS_URL);
|
|
109947
|
+
if (rows === null)
|
|
109948
|
+
return null;
|
|
109949
|
+
let sum = 0;
|
|
109950
|
+
for (const raw of rows) {
|
|
109951
|
+
if (!raw || typeof raw !== 'object')
|
|
109952
|
+
continue;
|
|
109953
|
+
const r = raw;
|
|
109954
|
+
const cur = String(r.currency ?? '').toUpperCase();
|
|
109955
|
+
if (cur !== 'USD' && cur !== 'US')
|
|
109956
|
+
continue;
|
|
109957
|
+
sum += num(r.balance);
|
|
109958
|
+
}
|
|
109959
|
+
return sum;
|
|
108652
109960
|
}
|
|
108653
109961
|
|
|
108654
109962
|
|
|
@@ -108871,6 +110179,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
108871
110179
|
/* harmony export */ applyParsedApproachesFromDrive: () => (/* binding */ applyParsedApproachesFromDrive),
|
|
108872
110180
|
/* harmony export */ getCreoApproachOverride: () => (/* binding */ getCreoApproachOverride),
|
|
108873
110181
|
/* harmony export */ getImageApproachCounts: () => (/* binding */ getImageApproachCounts),
|
|
110182
|
+
/* harmony export */ getImageApproachNoBulletsMode: () => (/* binding */ getImageApproachNoBulletsMode),
|
|
110183
|
+
/* harmony export */ getImageBulletsGlobalOff: () => (/* binding */ getImageBulletsGlobalOff),
|
|
108874
110184
|
/* harmony export */ getPairsCount: () => (/* binding */ getPairsCount),
|
|
108875
110185
|
/* harmony export */ getPromptOverride: () => (/* binding */ getPromptOverride),
|
|
108876
110186
|
/* harmony export */ getSelectedPairApproaches: () => (/* binding */ getSelectedPairApproaches),
|
|
@@ -109000,6 +110310,19 @@ function normalizeImageApproachCountsFromDrive(raw) {
|
|
|
109000
110310
|
return null;
|
|
109001
110311
|
return out;
|
|
109002
110312
|
}
|
|
110313
|
+
/**
|
|
110314
|
+
* «Везде без обязательных буллетов» (генерация + валидатор). Через `promptOverrides` (localStorage).
|
|
110315
|
+
*/
|
|
110316
|
+
function getImageBulletsGlobalOff() {
|
|
110317
|
+
return Boolean(loadPromptOverrides().imageBulletsGlobalOff);
|
|
110318
|
+
}
|
|
110319
|
+
/** Режим буллетов для крео-подхода; без записи = default. */
|
|
110320
|
+
function getImageApproachNoBulletsMode(approachName) {
|
|
110321
|
+
const raw = loadPromptOverrides().imageApproachNoBulletsMode?.[approachName];
|
|
110322
|
+
if (raw === 'off' || raw === 'on' || raw === 'default')
|
|
110323
|
+
return raw;
|
|
110324
|
+
return 'default';
|
|
110325
|
+
}
|
|
109003
110326
|
/**
|
|
109004
110327
|
* Получить количество изображений по каждому подходу (N элементов, 0–MAX_IMAGES_PER_CREO_APPROACH).
|
|
109005
110328
|
* По умолчанию — по 1 на каждый подход.
|
|
@@ -109217,8 +110540,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
109217
110540
|
/* harmony export */ PAIR_APPROACH_POOL: () => (/* binding */ PAIR_APPROACH_POOL),
|
|
109218
110541
|
/* harmony export */ TEXTS_APPROACH_POOL: () => (/* binding */ TEXTS_APPROACH_POOL),
|
|
109219
110542
|
/* harmony export */ TITLES_APPROACH_POOL: () => (/* binding */ TITLES_APPROACH_POOL),
|
|
110543
|
+
/* harmony export */ getCreoApproachBaseNameFromImageLabel: () => (/* binding */ getCreoApproachBaseNameFromImageLabel),
|
|
109220
110544
|
/* harmony export */ getCreoApproachExpandedTasks: () => (/* binding */ getCreoApproachExpandedTasks),
|
|
109221
110545
|
/* harmony export */ getCreoApproaches: () => (/* binding */ getCreoApproaches),
|
|
110546
|
+
/* harmony export */ getEffectiveCreoNoBullets: () => (/* binding */ getEffectiveCreoNoBullets),
|
|
109222
110547
|
/* harmony export */ getImageGenerationBasePrompt: () => (/* binding */ getImageGenerationBasePrompt),
|
|
109223
110548
|
/* harmony export */ getPairsSystemPrompt: () => (/* binding */ getPairsSystemPrompt),
|
|
109224
110549
|
/* harmony export */ getPairsUserPrompt: () => (/* binding */ getPairsUserPrompt),
|
|
@@ -109276,6 +110601,24 @@ function pickOne(arr) {
|
|
|
109276
110601
|
function shuffle(arr) {
|
|
109277
110602
|
return [...arr].sort(() => Math.random() - 0.5);
|
|
109278
110603
|
}
|
|
110604
|
+
/** Суффикс ` (1:1)` / ` (2:3)` в подписи слота — убрать, чтобы сопоставить с CREO_APPROACHES. */
|
|
110605
|
+
function getCreoApproachBaseNameFromImageLabel(approachLabel) {
|
|
110606
|
+
return approachLabel.replace(/\s+\((1:1|2:3)\)\s*$/, '').trim() || approachLabel;
|
|
110607
|
+
}
|
|
110608
|
+
/**
|
|
110609
|
+
* Итог: буллет-блок **не** использовать (0 буллетов), с учётом глобального и per-approach в promptOverrides
|
|
110610
|
+
* и умолчания `noBullets` в `CREO_APPROACHES`.
|
|
110611
|
+
*/
|
|
110612
|
+
function getEffectiveCreoNoBullets(approach) {
|
|
110613
|
+
if ((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.getImageBulletsGlobalOff)())
|
|
110614
|
+
return true;
|
|
110615
|
+
const mode = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.getImageApproachNoBulletsMode)(approach.name);
|
|
110616
|
+
if (mode === 'off')
|
|
110617
|
+
return true;
|
|
110618
|
+
if (mode === 'on')
|
|
110619
|
+
return false;
|
|
110620
|
+
return Boolean(approach.noBullets);
|
|
110621
|
+
}
|
|
109279
110622
|
/** Выбрать 3 случайных буллета по правилам подхода (1 из каждой категории, порядок случайный) */
|
|
109280
110623
|
function pickRandomBullets(approachName) {
|
|
109281
110624
|
const categories = APPROACH_BULLET_CATEGORIES[approachName];
|
|
@@ -109658,32 +111001,58 @@ function getValidationProductReferencePreamble() {
|
|
|
109658
111001
|
---
|
|
109659
111002
|
`;
|
|
109660
111003
|
}
|
|
111004
|
+
function getValidationPromptBulletAddendum(expectNoBullets) {
|
|
111005
|
+
if (expectNoBullets === undefined)
|
|
111006
|
+
return '';
|
|
111007
|
+
if (expectNoBullets) {
|
|
111008
|
+
return `
|
|
111009
|
+
|
|
111010
|
+
---
|
|
111011
|
+
АВТО — БУЛЛЕТЫ ДЛЯ ЭТОГО КРЕО (подмешано приложением):
|
|
111012
|
+
- Отдельный вертикальный список из трёх выгод с «галочками»/иконками **не** требуется. Не пиши ОШИБКИ «нет 3 буллетов», «нужен список выгод», «недостаточно буллетов».
|
|
111013
|
+
- Не добавляй в список ОШИБОК пункты по вертикальности, «ровно 3», иконкам у буллетов, читаемости буллетов.`;
|
|
111014
|
+
}
|
|
111015
|
+
return `
|
|
111016
|
+
|
|
111017
|
+
---
|
|
111018
|
+
АВТО — БУЛЛЕТЫ ДЛЯ ЭТОГО КРЕО (подмешано приложением):
|
|
111019
|
+
- Должны быть **три** отдельные короткие выгоды (вертикальный список), с визуальными галочками/иконками, **вне** банки/упаковки. **ОШИБКА**, если визуально **нет** такого блока или **меньше трёх** отдельных читаемых строк (не путай с ценой/скидкой).`;
|
|
111020
|
+
}
|
|
109661
111021
|
/**
|
|
109662
111022
|
* Промпт для валидации рекламных креативов.
|
|
109663
111023
|
* `keywords` — только для подстановки в кастомный override (${keywords}); в дефолтном тексте не используется.
|
|
111024
|
+
* `options.expectNoBullets` — true: не требовать 3 буллета; false: требовать три выгоды-строки. undefined: как «true» (как раньше).
|
|
109664
111025
|
*/
|
|
109665
111026
|
function getValidationPrompt(product, geo, keywords, approachName, noOverride,
|
|
109666
111027
|
/** Краткий эталон цен из приложения (новая + ожидаемая старая при -50%); пусто — без сверки чисел */
|
|
109667
|
-
priceBrief) {
|
|
111028
|
+
priceBrief, options) {
|
|
111029
|
+
const expectNoBullets = options?.expectNoBullets !== false;
|
|
109668
111030
|
if (!noOverride) {
|
|
109669
111031
|
const override = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.getPromptOverride)('getValidationPrompt');
|
|
109670
111032
|
if (override?.enabled && override.customPrompt) {
|
|
109671
111033
|
const approachLine = approachName?.trim() ? `\nПОДХОД: ${approachName.trim()}\n` : '\n';
|
|
109672
|
-
|
|
111034
|
+
const base = override.customPrompt
|
|
109673
111035
|
.replace(/\$\{product\}/g, product)
|
|
109674
111036
|
.replace(/\$\{geo\}/g, geo)
|
|
109675
111037
|
.replace(/\$\{keywords\}/g, keywords.join(', '))
|
|
109676
111038
|
.replace(/\$\{approachLine\}/g, approachLine)
|
|
109677
111039
|
.replace(/\$\{priceBrief\}/g, priceBrief?.trim() || 'В приложении бриф цены не задан — сверяй только визуально две цены и -50%.');
|
|
111040
|
+
return base + getValidationPromptBulletAddendum(options?.expectNoBullets);
|
|
109678
111041
|
}
|
|
109679
111042
|
}
|
|
109680
111043
|
const approachLine = approachName?.trim() ? `\nПОДХОД: ${approachName.trim()}\n` : '\n';
|
|
109681
111044
|
const isScreenshotReviews = (approachName?.trim() ?? '') === 'Скрин отзывов';
|
|
109682
|
-
|
|
109683
|
-
|
|
109684
|
-
|
|
111045
|
+
const step0BulletsHint = expectNoBullets
|
|
111046
|
+
? 'BULLETS: кратко опиши, что видишь (для справки). Для **этого** крео отдельные три benefit-строки с «галочками» **не** обязательны; не используй для вердикта требований «ровно 3».'
|
|
111047
|
+
: 'BULLETS: укажи, видишь ли **три** отдельные короткие выгоды (вертикальный список, иконки/✓) вне банки. Если **нет** трёх различимых строк — явно напиши «< 3» или «нет списка».';
|
|
111048
|
+
const step2Bullets = expectNoBullets
|
|
111049
|
+
? `ШАГ 2 — БУЛЛЕТЫ:
|
|
109685
111050
|
- Не проверяй и не оценивай количество, отсутствие или наличие буллетов. 0, 1, 2, 3 и больше — всё допустимо.
|
|
109686
|
-
- НЕ добавляй в финальный список ошибок ни одного пункта, связанного с буллетами (вертикальность, «ровно 3», иконки, читаемость буллетов и т.п.)
|
|
111051
|
+
- НЕ добавляй в финальный список ошибок ни одного пункта, связанного с буллетами (вертикальность, «ровно 3», иконки, читаемость буллетов и т.п.).`
|
|
111052
|
+
: `ШАГ 2 — БУЛЛЕТЫ (жёстко для этого крео):
|
|
111053
|
+
- Должны присутствовать **три** отдельные короткие выгоды, визуально как вертикальный список, с иконками/галочками, **вне** упаковки/банки.
|
|
111054
|
+
- **ОШИБКА**, если визуально **нет** такого блока, **меньше трёх** читаемых отдельных строк, или неразличимы 3 смысла. Не путай с ценой, скидкой и CTA.
|
|
111055
|
+
- **ОШИБКА**, если выгоды печатны **на** банке/этикетке (должны быть в рекламном слое, не на продукте).`;
|
|
109687
111056
|
const priceBriefTrim = priceBrief?.trim() || '';
|
|
109688
111057
|
const stepPriceBrief = priceBriefTrim
|
|
109689
111058
|
? `ШАГ P — ЦЕНЫ (сначала макет, потом бриф):
|
|
@@ -109693,12 +111062,16 @@ ${priceBriefTrim}
|
|
|
109693
111062
|
1) ВНУТРЕННЯЯ ЛОГИКА НА МАКЕТЕ (главное):
|
|
109694
111063
|
- Должны быть видны две суммы: новая (акционная) и старая (зачёркнутая). Числовое отношение: старая ≈ вдвое новой при скидке -50% (допуск до ~2% из‑за округления; «1 180» и «1180» — одно и то же). На макете **не должно** быть текста «2×»/«2x» перед суммой как множитель — только две суммы (см. ШАГ 4).
|
|
109695
111064
|
- Если отношение старая/новая ≈ 2 (в пределах допуска) — это уже доказательство корректной пары -50% на макете. В этом случае ЗАПРЕЩЕНО выводить ОШИБКУ формулировками вроде «выдуманные цены», «неверные суммы», «не соответствуют брифу» — даже если цифры в брифе другие или бриф кажется не тем.
|
|
109696
|
-
- Если пара математически согласована с -50% и процент «-50%» где‑либо читаем в зоне оффера (см. ШАГ 4) — не придумывай расхождение с брифом из‑за
|
|
111065
|
+
- Если пара математически согласована с -50% и процент «-50%» где‑либо читаем в зоне оффера (см. ШАГ 4) — не придумывай расхождение с брифом из‑за **эквивалентного написания той же валюты**, что в брифе: символ ↔ код ↔ локальное слово для **одной** валюты (например € / EUR / «евро» для евро; $ / USD; MXN и т.п.) и из‑за пробелов/типографики. Это **не** отменяет пункт 1a ниже: другая денежная единица — всегда ошибка.
|
|
111066
|
+
|
|
111067
|
+
1a) ВАЛЮТА ОБЯЗАТЕЛЬНО КАК В БРИФЕ (критично):
|
|
111068
|
+
- В брифе указана конкретная валюта (например EUR). На макете в блоке цен должна быть **именно она** (символ €, код EUR, или привычное для GEO написание «евро» **как валюта цены**, если это явно евро). **ОШИБКА, НУЖНА ПЕРЕСБОРКА**, если читается **иная** национальная валюта или её сокращение: при брифе EUR — **лв**, **лв.**, BGN, **лев**, руб/₽, zł, lei, kn, Kč и любые другие явные обозначения **не евро** рядом с суммами. Пример из практики: «50 лв» / «25 лв» при брифе в EUR — **недопустимо**, даже если 50/25 математически дают -50%.
|
|
111069
|
+
- Если валюту на макете нельзя прочитать уверенно — не гадай в пользу OK: при явном брифе с кодом валюты лучше отметь риск; при двусмысленности между двумя валютами — **ОШИБКА** или явное требование пересборки с читаемой валютой из брифа.
|
|
109697
111070
|
|
|
109698
111071
|
2) СВЕРКА С БРИФОМ (только когда сопоставимо):
|
|
109699
111072
|
- Сравнивай число НОВОЙ цены с брифом ТОЛЬКО если валюта на макете явно та же, что в брифе (EUR↔EUR, MXN↔MXN и т.д.; символ € и код EUR — одна валюта). Допускается разное оформление числа (пробелы тысяч, запятая/точка).
|
|
109700
|
-
- Если валюта на креативе
|
|
109701
|
-
- Ошибку по ценам ставь
|
|
111073
|
+
- Если валюта на креативе **однозначно другая**, чем в брифе — это уже **ОШИБКА** по п. 1a; совпадение цифр не спасает. Если валюта нечитаема — см. п. 1a. Если валюта совпадает с брифом — сравнивай числа как раньше.
|
|
111074
|
+
- Ошибку по ценам ставь если: (а) на макете нет двух цен / нет согласованности -50%, ИЛИ (а') **неверная валюта относительно брифа** (п. 1a), ИЛИ (б) валюта однозначно совпадает с брифом, а число новой цены явно другое (не в пределах округления).
|
|
109702
111075
|
|
|
109703
111076
|
3) Цена не должна быть оформлена как строка буллета с галочкой — отдельный блок.`
|
|
109704
111077
|
: `ШАГ P — ЦЕНЫ (бриф числом не задан):
|
|
@@ -109759,10 +111132,11 @@ ${step3OtherText}
|
|
|
109759
111132
|
- Если скидка указана и она не равна -50% — ошибка.
|
|
109760
111133
|
|
|
109761
111134
|
ШАГ 5 — ЯЗЫК (критично):
|
|
109762
|
-
- В рекламном тексте (HOOK/HEADLINE, текст на буллетах если есть, CTA
|
|
109763
|
-
-
|
|
111135
|
+
- В рекламном тексте (HOOK/HEADLINE, текст на буллетах если есть, CTA, PRICE, OTHER_TEXT) НЕТ произвольных английских слов и фраз. Если есть — ошибка.
|
|
111136
|
+
- **ИСКЛЮЧЕНИЕ — бейдж скидки (DISCOUNT):** на малой плашке с процентом допустимы привычные глобальные маркеры **OFF**, **SALE** рядом с «-50%» / числом процента (например «-50% OFF», «SALE −50%») — **не** считать смешением языков и **не** ставить ОШИБКУ только из‑за этих слов **в этом блоке скидки**. HOOK, CTA, буллеты и прочий рекламный текст по-прежнему строго на языке GEO.
|
|
111137
|
+
- ИСКЛЮЧЕНИЕ: внутри **графики интерфейса телефона** (шапка окна приложения, подпись вкладки вроде «Reviews», «App Store»-стиль бейджа в углу рамки) английские слова **не** считать ошибкой — это имитация ОС/магазина, не рекламный текст баннера. Ошибкой остаётся английский в HOOK над макетом, в CTA, в буллетах, на строках **сумм** (кроме кода валюты ISO и символа €/$ и т.п.), в теле отзыва как пользовательском тексте (не в подписи UI). Бейдж скидки — см. исключение OFF/SALE выше.
|
|
109764
111138
|
- ЗАПРЕЩЁННЫЕ служебные подписи на макете (частая ошибка модели): слова HOOK, CTA, CAPS, BULLET, HEADLINE, PRICE, DISCOUNT как видимый текст на плашках или кнопке — ОШИБКА (это метки из брифа, не для читателя).
|
|
109765
|
-
- Все слова соответствуют GEO/языку ${geo}.
|
|
111139
|
+
- Все слова соответствуют GEO/языку ${geo}. Смешение языков — ошибка, **кроме** исключений выше (OFF/SALE на бейдже скидки; UI телефона).
|
|
109766
111140
|
- ПСЕВДОСЛОВА И ОПЕЧАТКИ: если на плашке скидки или в буллетах видно **несуществующее** или явно ошибочное слово для языка GEO (не словарное), либо «калька» под английский без нормы (пример для испанского: «DISCONTA» вместо «DESCUENTO»; на буллете англ. «COMFORT» вместо исп. «CONFORT»/«COMODIDAD») — ОШИБКА языка (приземлённая формулировка в строке ОШИБКА).
|
|
109767
111141
|
|
|
109768
111142
|
ШАГ 6 — КОМПОЗИЦИЯ:
|
|
@@ -109796,10 +111170,10 @@ function getImageGenerationBasePrompt(generateGeo, generatePrice, generateCurren
|
|
|
109796
111170
|
}
|
|
109797
111171
|
_debugLog('⚠️ Using DEFAULT getImageGenerationBasePrompt');
|
|
109798
111172
|
}
|
|
109799
|
-
// Подходы без буллитов — из подходов с count > 0
|
|
111173
|
+
// Подходы без буллитов — из подходов с count > 0 (умолчание + per-approach + глобал)
|
|
109800
111174
|
const counts = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.getImageApproachCounts)();
|
|
109801
111175
|
const selectedApproaches = CREO_APPROACHES.filter((_, i) => counts[i] > 0);
|
|
109802
|
-
const noBulletsNames = selectedApproaches.filter(a => a
|
|
111176
|
+
const noBulletsNames = selectedApproaches.filter(a => getEffectiveCreoNoBullets(a)).map(a => a.name);
|
|
109803
111177
|
const noBulletsCond = noBulletsNames.map(n => `"${n}"`).join(' или ');
|
|
109804
111178
|
const totalApproaches = counts.reduce((a, b) => a + b, 0);
|
|
109805
111179
|
const ratio = aspectRatio || '1:1';
|
|
@@ -109969,14 +111343,16 @@ function getCreoApproachExpandedTasks() {
|
|
|
109969
111343
|
if (!approach)
|
|
109970
111344
|
continue;
|
|
109971
111345
|
const override = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.getCreoApproachOverride)(approach.name);
|
|
111346
|
+
const effNoBullets = getEffectiveCreoNoBullets(approach);
|
|
109972
111347
|
const resolved = override?.enabled
|
|
109973
111348
|
? {
|
|
109974
111349
|
...approach,
|
|
111350
|
+
noBullets: effNoBullets,
|
|
109975
111351
|
prompt: override.customPrompt || approach.prompt,
|
|
109976
111352
|
headlineAngle: override.customHeadlineAngle || approach.headlineAngle,
|
|
109977
111353
|
bulletsFocus: override.customBulletsFocus || approach.bulletsFocus
|
|
109978
111354
|
}
|
|
109979
|
-
: approach;
|
|
111355
|
+
: { ...approach, noBullets: effNoBullets };
|
|
109980
111356
|
if (override?.enabled) {
|
|
109981
111357
|
_debugLog(`✅ Using CUSTOM approach: ${approach.name}`, `hasPrompt=${!!override.customPrompt}`, `hasHeadline=${!!override.customHeadlineAngle}`, `hasBullets=${!!override.customBulletsFocus}`);
|
|
109982
111358
|
}
|