Nuova gestione chiusura tagli prezzo
This commit is contained in:
32
public_html/chiusura_tagli_prezzo.php
Normal file
32
public_html/chiusura_tagli_prezzo.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
session_start();
|
||||
include "functions.php";
|
||||
require_once "include_login.php";
|
||||
include "config.php";
|
||||
include "include/module.php";
|
||||
|
||||
include Controller::current_mainClasspath();
|
||||
(new ChiusuraTagliPrezzoAjax())->checkAjaxRequests();
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<!--html manifest="manifest.appcache"-->
|
||||
<html lang="it">
|
||||
<head>
|
||||
<?php include pvm_tagHead; ?>
|
||||
</head>
|
||||
<body>
|
||||
<?php include pvm_headerNavbar; ?>
|
||||
<?php include pvm_splashScreen; ?>
|
||||
<div id="content">
|
||||
<div><?php
|
||||
include pvm_navTab;
|
||||
if (!PVM\CurrentModule::isAuthorizedToCurrentUser()) {
|
||||
include pvm_unauthorized;
|
||||
} else {
|
||||
include Controller::current_gestpath_mainPage();
|
||||
} ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php include pvm_footerMinimal; ?>
|
||||
</body>
|
||||
</html>
|
||||
@@ -2275,5 +2275,18 @@
|
||||
"kendo"
|
||||
],
|
||||
"requirePermission": true
|
||||
},
|
||||
"chiusura_tagli_prezzo": {
|
||||
"title": "Chiusura Tagli Prezzo",
|
||||
"pages": "chiusura_tagli_prezzo.php",
|
||||
"position": [],
|
||||
"children": [],
|
||||
"icon": "icon.png",
|
||||
"libs": [
|
||||
"std-pkg",
|
||||
"flexbox",
|
||||
"kendo"
|
||||
],
|
||||
"requirePermission": true
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
class ChiusuraTagliPrezzo {
|
||||
public static function _moduleDatasource($filter) {
|
||||
$Ret = new Ret;
|
||||
if ($Ret->is_OK()) {
|
||||
$retData = array(
|
||||
array("id" => "name", "data" => array()),
|
||||
);
|
||||
$Ret->set_data($retData);
|
||||
}
|
||||
return $Ret;
|
||||
}
|
||||
|
||||
public static function getPromozioni($data) {
|
||||
$dataVal = array_get($data, "dataVal");
|
||||
|
||||
if (is_null($dataVal)) {
|
||||
return Ret::errorCode(ErrorHandler::MISSING_PARAMS, "getPromozioni");
|
||||
}
|
||||
|
||||
$query = KendoService::queryInitializerService($data, "get-promozioni", "1, 2", false, false);
|
||||
|
||||
$query->setDateVar("dataVal", $dataVal);
|
||||
|
||||
$ret = $query->toRet()->execute();
|
||||
|
||||
if ($ret->is_OK()) {
|
||||
$promozioni = $ret->get_data();
|
||||
|
||||
$ret->set_data(array(
|
||||
"data" => $promozioni,
|
||||
"total" => array_get($promozioni, "0.rows_count")
|
||||
));
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public static function updateListiniVend($data) {
|
||||
$promozioni = array_get($data, "promozioni");
|
||||
|
||||
$promozioni = array_map(function ($promozione) {
|
||||
return EntityItem::fromArray($promozione);
|
||||
}, $promozioni);
|
||||
|
||||
$entityList = new EntityList();
|
||||
|
||||
foreach ($promozioni as $promozione) {
|
||||
$entityList->push($promozione);
|
||||
}
|
||||
|
||||
$imsApi = new IMSApi();
|
||||
|
||||
$imsApi
|
||||
->post("listini-vendita/update")
|
||||
->body($entityList);
|
||||
|
||||
return $imsApi->send();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
class ChiusuraTagliPrezzoAjax extends Ajax {
|
||||
protected function checkCustomRequests() {
|
||||
if (self::get("popup-sample")) {
|
||||
$data = Utility::sanitizeB64JSON_parse($_GET["popup-sample"]);
|
||||
include "popup-sample.php";
|
||||
}
|
||||
}
|
||||
}
|
||||
1
public_html/gest-lib/chiusura_tagli_prezzo/css/main.css
Normal file
1
public_html/gest-lib/chiusura_tagli_prezzo/css/main.css
Normal file
@@ -0,0 +1 @@
|
||||
/*# sourceMappingURL=main.css.map */
|
||||
BIN
public_html/gest-lib/chiusura_tagli_prezzo/icon.png
Normal file
BIN
public_html/gest-lib/chiusura_tagli_prezzo/icon.png
Normal file
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
<?php ?>
|
||||
|
||||
<div id="app">Caricamento...</div>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
$Ret = new Ret;
|
||||
|
||||
if ($Ret->is_OK()) {
|
||||
ob_start();
|
||||
|
||||
$html = Utility\Str::remove_multiple_spaces(@ob_get_clean());
|
||||
$Ret->set_string($html);
|
||||
}
|
||||
|
||||
$Ret->display();
|
||||
@@ -0,0 +1,98 @@
|
||||
WITH art AS (SELECT cod_mart, cod_mart AS cod_mart_mov, descrizione
|
||||
FROM carelli.dbo.mtb_aart
|
||||
WHERE articolo_composto = 'N'
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT mtb_aart.cod_mart, mtb_comp.cod_comp AS cod_Mart_mov, descrizione
|
||||
FROM carelli.dbo.mtb_aart
|
||||
INNER JOIN carelli.dbo.mtb_comp ON mtb_aart.cod_mart = mtb_comp.cod_mart
|
||||
WHERE articolo_composto = 'S'),
|
||||
ordini AS (SELECT dtb_ordr.cod_mart,
|
||||
t.data_ord,
|
||||
t.num_ord,
|
||||
listino,
|
||||
data_esportazione,
|
||||
t.serie,
|
||||
t.cod_mdep
|
||||
FROM carelli.dbo.dtb_ordt t
|
||||
INNER JOIN carelli.dbo.dtb_ordr ON
|
||||
t.data_ord = dtb_ordr.data_ord AND
|
||||
t.num_ord = dtb_ordr.num_ord AND
|
||||
t.gestione = dtb_ordr.gestione
|
||||
WHERE CAST(t.data_esportazione AS DATE) = DATEADD(DAY, -1, CAST(GETDATE() AS DATE))
|
||||
AND flag_annulla <> 'S'
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT dtb_ordr.cod_mart,
|
||||
t.data_ord,
|
||||
t.num_ord,
|
||||
listino,
|
||||
data_esportazione,
|
||||
t.serie,
|
||||
t.cod_mdep
|
||||
FROM panimal.dbo.dtb_ordt t
|
||||
INNER JOIN panimal.dbo.dtb_ordr ON
|
||||
t.data_ord = dtb_ordr.data_ord AND
|
||||
t.num_ord = dtb_ordr.num_ord AND
|
||||
t.gestione = dtb_ordr.gestione
|
||||
WHERE CAST(t.data_esportazione AS DATE) = DATEADD(DAY, -1, CAST(GETDATE() AS DATE))
|
||||
AND flag_annulla <> 'S'
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT dtb_ordr.cod_mart,
|
||||
t.data_ord,
|
||||
t.num_ord,
|
||||
listino,
|
||||
data_esportazione,
|
||||
t.serie,
|
||||
t.cod_mdep
|
||||
FROM gestfood.dbo.dtb_ordt t
|
||||
INNER JOIN gestfood.dbo.dtb_ordr ON
|
||||
t.data_ord = dtb_ordr.data_ord AND
|
||||
t.num_ord = dtb_ordr.num_ord AND
|
||||
t.gestione = dtb_ordr.gestione
|
||||
WHERE CAST(t.data_esportazione AS DATE) = DATEADD(DAY, -1, CAST(GETDATE() AS DATE))
|
||||
AND flag_annulla <> 'S'),
|
||||
tmp_ord AS (SELECT art.cod_mart,
|
||||
art.descrizione,
|
||||
cod_mart_mov,
|
||||
ordini.data_ord,
|
||||
ordini.num_ord,
|
||||
ordini.listino,
|
||||
ordini.data_esportazione,
|
||||
CAST(IIF(ordini.serie = 'SU', 1, 0) AS BIT) AS sudd,
|
||||
mtb_depo.cod_vlis
|
||||
FROM ordini
|
||||
INNER JOIN art ON ordini.cod_mart = art.cod_mart
|
||||
INNER JOIN mtb_depo ON ordini.cod_mdep = mtb_depo.cod_mdep),
|
||||
TempResult AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_number,
|
||||
*
|
||||
FROM (SELECT DISTINCT promo.cod_vlis + '-' + promo.cod_mart AS id,
|
||||
promo.cod_vlis,
|
||||
promo.descrizione,
|
||||
promo.cod_mart,
|
||||
mtb_aart.descrizione AS articolo,
|
||||
data_iniz,
|
||||
data_fine,
|
||||
cod_promo,
|
||||
promo.note,
|
||||
aggiornato_da,
|
||||
prz_vend_iva,
|
||||
ordini.sudd,
|
||||
CAST(IIF(ordini.data_ord IS NOT NULL, 1, 0) AS BIT) AS flag_riass
|
||||
FROM dbo.getPromozioneVendita('[dataVal]', '[dataVal]', NULL, NULL, NULL) promo
|
||||
INNER JOIN mtb_aart ON promo.cod_marT = mtb_aart.cod_mart
|
||||
LEFT OUTER JOIN tmp_ord ordini ON promo.cod_vlis = ordini.cod_vlis AND
|
||||
promo.cod_mart = ordini.cod_mart AND
|
||||
ordini.data_ord BETWEEN promo.data_iniz AND promo.data_fine) t
|
||||
WHERE [filter]),
|
||||
TempCount AS (SELECT COUNT(*) AS rows_count
|
||||
FROM TempResult)
|
||||
SELECT TempResult.*,
|
||||
TempCount.*
|
||||
FROM TempResult,
|
||||
TempCount
|
||||
ORDER BY [orderBy]
|
||||
@@ -0,0 +1,373 @@
|
||||
import ViewModule from "@js/modules/ViewModule.js";
|
||||
import mapKeys from "lodash-es/mapKeys.js";
|
||||
import camelCase from "lodash-es/camelCase.js";
|
||||
|
||||
export class Promozione extends kendo.data.Model.define({
|
||||
id: "id",
|
||||
fields: {
|
||||
id: {type: "string"},
|
||||
cod_vlis: {type: "string"},
|
||||
descrizione: {type: "string"},
|
||||
cod_mart: {type: "string"},
|
||||
articolo: {type: "string"},
|
||||
data_iniz: {type: "date"},
|
||||
data_fine: {type: "date"},
|
||||
cod_promo: {type: "string"},
|
||||
note: {type: "string"},
|
||||
aggiornato_da: {type: "string"},
|
||||
prz_vend_iva: {type: "number"},
|
||||
sudd: {type: "boolean"},
|
||||
flag_riass: {type: "boolean"},
|
||||
}
|
||||
}) {
|
||||
id_ord: string
|
||||
cod_vlis: string
|
||||
descrizione: string
|
||||
cod_mart: string
|
||||
articolo: string
|
||||
data_iniz: Date
|
||||
data_fine: Date
|
||||
cod_promo: string
|
||||
note: string
|
||||
aggiornato_da: string
|
||||
prz_vend_iva: number
|
||||
sudd: boolean
|
||||
flag_riass: boolean
|
||||
type = "mtb_lisv_data"
|
||||
}
|
||||
|
||||
export default class ChiusuraTagliPrezzo extends ViewModule {
|
||||
private dataVal: kendo.ui.DatePicker
|
||||
private checkboxRiass: kendo.ui.CheckBox
|
||||
private checkboxMiePromo: kendo.ui.CheckBox
|
||||
private readonly columnsPromozioni: Array<kendo.ui.GridColumn>
|
||||
private readonly dataSourcePromozioni: kendo.data.DataSource
|
||||
private tablePromozioni: kendo.ui.Grid
|
||||
|
||||
constructor(selector: string | null) {
|
||||
super(selector);
|
||||
|
||||
this.columnsPromozioni = _kendo.setDefaultCellOptions([
|
||||
{
|
||||
id: "c0f8bf55-9744-4bdd-a4f0-8db3066e88a7",
|
||||
field: "cod_mart",
|
||||
title: "Cod. Art.",
|
||||
type: "string",
|
||||
filterable: {
|
||||
operators: {
|
||||
string: {
|
||||
contains: "Contiene",
|
||||
doesnotcontain: "Non contiene"
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "f7d7626e-73c8-4d4b-818d-f7dd81c49827",
|
||||
field: "articolo",
|
||||
title: "Articolo",
|
||||
type: "string",
|
||||
filterable: {
|
||||
operators: {
|
||||
string: {
|
||||
contains: "Contiene",
|
||||
doesnotcontain: "Non contiene"
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "eb844518-e289-4a0f-9d34-fed9ad7e17fd",
|
||||
field: "cod_vlis",
|
||||
title: "Listino",
|
||||
type: "string",
|
||||
filterable: {
|
||||
operators: {
|
||||
string: {
|
||||
contains: "Contiene",
|
||||
doesnotcontain: "Non contiene"
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "5e817e11-901a-4a4c-9263-1fdadcadcc78",
|
||||
field: "descrizione",
|
||||
title: "Descrizione",
|
||||
type: "string",
|
||||
filterable: {
|
||||
operators: {
|
||||
string: {
|
||||
contains: "Contiene",
|
||||
doesnotcontain: "Non contiene"
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "b01bedb3-2ac4-4c15-b1be-3f108a772015",
|
||||
field: "data_iniz",
|
||||
title: "Data Inizio",
|
||||
type: "date",
|
||||
format: "{0:dd/MM/yyyy}",
|
||||
},
|
||||
{
|
||||
id: "9256ed35-434d-4ee6-9e2f-9b4f1c2a00ab",
|
||||
field: "data_fine",
|
||||
title: "Data Fine",
|
||||
type: "date",
|
||||
format: "{0:dd/MM/yyyy}"
|
||||
},
|
||||
{
|
||||
id: "dd73e45b-31ff-480a-a61a-f6887ef2cad7",
|
||||
field: "cod_promo",
|
||||
title: "Cod. Promo",
|
||||
type: "string"
|
||||
},
|
||||
{
|
||||
id: "0cc0e1d6-f57e-44f9-a11a-ecfe2bcbe94f",
|
||||
field: "note",
|
||||
title: "Note",
|
||||
type: "string"
|
||||
},
|
||||
{
|
||||
id: "0ad4f5a1-b9e6-4a41-bcb1-a785a0141b12",
|
||||
field: "sudd",
|
||||
title: "Suddivisione",
|
||||
type: "boolean",
|
||||
template: ({sudd}) => `<i class="fas fa-${sudd && "check" || "times"}"></i>`
|
||||
}
|
||||
]);
|
||||
|
||||
this.dataSourcePromozioni = new kendo.data.DataSource({
|
||||
transport: {
|
||||
read: async (options) => {
|
||||
_kendo.checkFilterValuesColumns(
|
||||
options.data.filter,
|
||||
this.columnsPromozioni
|
||||
);
|
||||
|
||||
try {
|
||||
const data = await this.getPromozioni({
|
||||
dataVal: this.dataVal.value(),
|
||||
...options.data,
|
||||
filter: {
|
||||
filters: [
|
||||
...options.data.filter?.filters || [],
|
||||
...this.checkboxRiass.check() && [{
|
||||
field: "flag_riass",
|
||||
operator: "eq",
|
||||
value: true
|
||||
}] || [],
|
||||
...this.checkboxMiePromo.check() && [{
|
||||
field: "aggiornato_da",
|
||||
operator: "contains",
|
||||
value: _USER.username
|
||||
}] || []
|
||||
],
|
||||
logic: "and"
|
||||
}
|
||||
});
|
||||
|
||||
options.success(data);
|
||||
} catch (e) {
|
||||
options.error(e);
|
||||
}
|
||||
}
|
||||
},
|
||||
schema: {
|
||||
data: "data",
|
||||
total: "total",
|
||||
model: Promozione
|
||||
},
|
||||
// sort: {
|
||||
// field: "cod_vlis",
|
||||
// dir: "desc"
|
||||
// },
|
||||
serverPaging: false,
|
||||
serverFiltering: true,
|
||||
serverSorting: false
|
||||
});
|
||||
}
|
||||
|
||||
async content(): Promise<string> {
|
||||
// language=HTML
|
||||
return `
|
||||
<aside class="flex gaps mb-10 align-center">
|
||||
<input type="text" id="dataVal" style="width: 10%">
|
||||
<div>
|
||||
<input type="checkbox" id="filterRiass" class="mt-0">
|
||||
</div>
|
||||
<div>
|
||||
<input type="checkbox" id="filterMiePromo" class="mt-0">
|
||||
</div>
|
||||
</aside>
|
||||
<div id="tablePromozioni"></div>
|
||||
`;
|
||||
}
|
||||
|
||||
name(): string {
|
||||
return "chiusura_tagli_prezzo";
|
||||
}
|
||||
|
||||
async onLoad(hideSplashScreen = true): Promise<void> {
|
||||
await super.onLoad(hideSplashScreen);
|
||||
|
||||
this.dataVal = this.$container.find("#dataVal").kendoDatePicker({
|
||||
dateInput: true,
|
||||
value: new Date(),
|
||||
label: "Data Validità",
|
||||
change: () => {
|
||||
this.dataSourcePromozioni.read();
|
||||
}
|
||||
}).data("kendoDatePicker");
|
||||
|
||||
this.checkboxRiass = this.$container.find("#filterRiass").kendoCheckBox({
|
||||
label: "Solo articoli riassortiti",
|
||||
change: () => {
|
||||
this.dataSourcePromozioni.read();
|
||||
}
|
||||
}).data("kendoCheckBox");
|
||||
|
||||
this.checkboxMiePromo = this.$container.find("#filterMiePromo").kendoCheckBox({
|
||||
label: "Visualizza mie promo",
|
||||
change: () => {
|
||||
this.dataSourcePromozioni.read();
|
||||
}
|
||||
}).data("kendoCheckBox");
|
||||
|
||||
this.tablePromozioni = await _kendo.savableTable(this.$container.find("#tablePromozioni"), "PROMOZIONI", {
|
||||
columns: this.columnsPromozioni,
|
||||
dataSource: this.dataSourcePromozioni,
|
||||
filterable: {
|
||||
mode: "menu"
|
||||
},
|
||||
pageable: false,
|
||||
selectable: "multiple, row",
|
||||
contextMenu: {
|
||||
body: [
|
||||
{
|
||||
name: "ChiusuraAnticipata",
|
||||
text: "Chiusura Anticipata",
|
||||
icon: "- fas fa-trash",
|
||||
command: "ChiusuraAnticipata"
|
||||
}
|
||||
],
|
||||
open: (e) => {
|
||||
const selectedRows = this.tablePromozioni.select();
|
||||
const targetTr = $(e.target).parents("tr").get(0);
|
||||
|
||||
if (!selectedRows.toArray().some(selectedRow => selectedRow === targetTr)) {
|
||||
this.tablePromozioni.clearSelection();
|
||||
this.tablePromozioni.select(targetTr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}, {autoBind: !!this.dataVal.value()});
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
kendo.ui.grid.commands["ChiusuraAnticipata"] = kendo.ui.grid.GridCommand.extend({
|
||||
exec: async () => {
|
||||
const selectedRows = this.tablePromozioni.select();
|
||||
|
||||
let promozioni = selectedRows
|
||||
.map((i, row) => this.tablePromozioni.dataItem(row).toJSON() as Promozione)
|
||||
.toArray();
|
||||
|
||||
const {dataFine, confirmed} = await this.askDataFinePromo();
|
||||
|
||||
console.log(dataFine, confirmed);
|
||||
|
||||
if (confirmed) {
|
||||
promozioni = promozioni
|
||||
.map(promozione => (promozione.data_fine = dataFine.toDate(), mapKeys(promozione, (v, key) => camelCase(key))));
|
||||
|
||||
if (await this.updateListiniVend(promozioni)) {
|
||||
await this.dataSourcePromozioni.read();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async getPromozioni(data: object = null) {
|
||||
const ret = await this.ajax()
|
||||
.get("getPromozioni")
|
||||
.data(data)
|
||||
.noticeAsModal()
|
||||
.execute();
|
||||
|
||||
return ret?.returnData as {
|
||||
data: Array<Promozione>
|
||||
total: number
|
||||
};
|
||||
}
|
||||
|
||||
async askDataFinePromo(): Promise<{ dataFine: moment.Moment, confirmed: boolean }> {
|
||||
// language=HTML
|
||||
return await new ModalBox()
|
||||
.content(`
|
||||
<div id="dataFine"></div>
|
||||
`)
|
||||
.onBeforeShow(($div) => {
|
||||
const $okBtn = $div.find(".modal-btn-ok");
|
||||
|
||||
$okBtn.disabled(true);
|
||||
|
||||
const today = moment().startOf("day");
|
||||
const yesterday = today.clone().subtract(1, "day").startOf("day");
|
||||
|
||||
$div.find("#dataFine").kendoDropDownList({
|
||||
dataTextField: "text",
|
||||
dataValueField: "value",
|
||||
optionLabel: {
|
||||
text: "Data di chiusura",
|
||||
value: null
|
||||
},
|
||||
dataSource: [
|
||||
{
|
||||
text: `Ieri - ${yesterday.format("DD/MM/YYYY")}`,
|
||||
value: yesterday
|
||||
},
|
||||
{
|
||||
text: `Oggi - ${today.format("DD/MM/YYYY")}`,
|
||||
value: today
|
||||
}
|
||||
],
|
||||
dataBound: (e) => e.sender.list.find(".k-list-optionlabel").hide(),
|
||||
select: (e) => $okBtn.disabled(!e.dataItem.value)
|
||||
} as kendo.ui.DropDownListOptions);
|
||||
})
|
||||
.btOK({
|
||||
text: "Conferma",
|
||||
dismissOnClick: true,
|
||||
onClick(e, $bt, $div) {
|
||||
return {
|
||||
dataFine: $div.find("#dataFine").val(),
|
||||
confirmed: true
|
||||
};
|
||||
}
|
||||
})
|
||||
.gridSize({
|
||||
xs: 12,
|
||||
md: 4
|
||||
})
|
||||
.okCancel()
|
||||
.title("Seleziona la data di chiusura")
|
||||
.show();
|
||||
}
|
||||
|
||||
async updateListiniVend(data: Promozione[]) {
|
||||
const ret = await this.ajax()
|
||||
.post("updateListiniVend")
|
||||
.data({
|
||||
promozioni: data
|
||||
})
|
||||
.noticeAsModal()
|
||||
.waitModal()
|
||||
.execute();
|
||||
|
||||
return ret?.returnId === 1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import ChiusuraTagliPrezzo from "./ChiusuraTagliPrezzo.js";
|
||||
|
||||
$(function () {
|
||||
new ChiusuraTagliPrezzo("#app");
|
||||
});
|
||||
@@ -105,7 +105,7 @@ input {
|
||||
}
|
||||
}
|
||||
|
||||
&[type="checkbox"] {
|
||||
&[type="checkbox"]:not(.k-checkbox) {
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user