diff --git a/README.md b/README.md index 45b6745..3e584b2 100644 --- a/README.md +++ b/README.md @@ -7,34 +7,23 @@ [![NPM](https://nodei.co/npm/iobroker.s7.png?downloads=true)](https://nodei.co/npm/iobroker.s7/) +## English +The Siemens S7 adapter is based on Snap7, with Snap7 when the +S7 adapter is also installed and the actual S7 communication between ioBroker and the S7 is organized via TCP / IP. -## Deutsch -Der Siemens S7 Adapter basiert auf Snap7, wobei Snap7 bei der Erstinstallation des -S7 Adapters mitinstalliert wird und die eigentliche S7-Kommunikation zwischen ioBroker und der S7 über TCP/IP organisiert. - -Es ist also notwendig, dass die S7 über eine Ethernet-Schnittstelle verfügt -(in der CPU integriert oder als separater CP) und über TCP/IP mit der Hardware kommunizieren kann, auf der ioBroker läuft. - -Es wird vorausgesetzt, dass der Anwender über die notwendigen Kenntnisse zur TCP/IP-Kommunikation verfügt -und in der Lage ist, die S7 mittels Step7 entsprechend zu konfigurieren und zu programmieren. -Der geübte Umgang mit PC und verschiedenen Betriebssystem ist ebenfalls Voraussetzung. -Diese Anforderungen stellen sicherlich keine Herausforderung für jemanden dar, -der die Kommunikation zwischen ioBroker und einer S7 in Erwägung zieht. +It is therefore necessary that the S7 has an Ethernet interface +(integrated in the CPU or as a separate CP) and can communicate via TCP / IP with the hardware on which ioBroker is running. -### Installation -Unter Linux braucht man `make` Umgebung um die binaries zu bauen. Das kann man mit folgendem Kommando installieren: +It is assumed that the user has the necessary knowledge of TCP / IP communication +and is able to configure and program the S7 accordingly using Step7. +Proficient use of a PC and various operating systems is also a prerequisite. +These requirements are certainly not a challenge for someone +who is considering communication between ioBroker and an S7. -``` -sudo apt-get update -sudo apt-get install build-essential -``` - -Unter windows braucht man Visual Studio 2013 (Community Edition ist genug) oder später. Auch Python 2.7 (nicht 3.x) muss installiert werden. -## English Format of the addresses for Inputs, Outputs or markers is "X.Y", where X is byte offset and Y is the bit offset in the byte. -Format of the addresses for DBs is "DBZ +X.Y", where z is number of DB, like "DB34 +12.0" +Format of the addresses for DBs is `DBZ +X.Y`, where `z` is number of `DB`, like `DB34 +12.0` -### Install +### Installation On some Linux systems the build essentials must be installed to get this adapter work. You can install it with: ``` @@ -55,12 +44,20 @@ You can use 4 time offset modes for S7TIME: ## S5TIME S5 decoded as described here: http://www.plccenter.cn/Siemens_Step7/Format_des_Datentyps_S5TIME_Zeitdauer.htm +## More information +More description could be found [here](https://github.com/ioBroker/ioBroker.s7/blob/master/docs/en/s7.md). + +## Deutsch +[German documentation](https://github.com/ioBroker/ioBroker.s7/blob/master/docs/de/s7.md) + ## Changelog +### 1.3.0 (2021-06-17) +* (bluefox) New configuration page on react ### 1.2.5 (2021-04-17) * (Apollon77) Fix pot crash case (Sentry IOBROKER-S7-16) @@ -210,10 +207,11 @@ S5 decoded as described here: http://www.plccenter.cn/Siemens_Step7/Format_des_D * Bugfix start file ## License - The MIT License (MIT) -Copyright (c) 2014-2021 smiling_Jack , bluefox +Copyright (c) 2014-2021 bluefox , + +Copyright (c) 2014-2016 smiling_Jack Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/admin/asset-manifest.json b/admin/asset-manifest.json new file mode 100644 index 0000000..98dfedd --- /dev/null +++ b/admin/asset-manifest.json @@ -0,0 +1,23 @@ +{ + "files": { + "main.css": "./static/css/main.c9480e85.chunk.css", + "main.js": "./static/js/main.27f6d84e.chunk.js", + "main.js.map": "./static/js/main.27f6d84e.chunk.js.map", + "runtime-main.js": "./static/js/runtime-main.0b37ba43.js", + "runtime-main.js.map": "./static/js/runtime-main.0b37ba43.js.map", + "static/css/2.c04f2d9d.chunk.css": "./static/css/2.c04f2d9d.chunk.css", + "static/js/2.b3a8d548.chunk.js": "./static/js/2.b3a8d548.chunk.js", + "static/js/2.b3a8d548.chunk.js.map": "./static/js/2.b3a8d548.chunk.js.map", + "index.html": "./index.html", + "static/css/2.c04f2d9d.chunk.css.map": "./static/css/2.c04f2d9d.chunk.css.map", + "static/css/main.c9480e85.chunk.css.map": "./static/css/main.c9480e85.chunk.css.map", + "static/js/2.b3a8d548.chunk.js.LICENSE.txt": "./static/js/2.b3a8d548.chunk.js.LICENSE.txt" + }, + "entrypoints": [ + "static/js/runtime-main.0b37ba43.js", + "static/css/2.c04f2d9d.chunk.css", + "static/js/2.b3a8d548.chunk.js", + "static/css/main.c9480e85.chunk.css", + "static/js/main.27f6d84e.chunk.js" + ] +} \ No newline at end of file diff --git a/admin/favicon.ico b/admin/favicon.ico new file mode 100644 index 0000000..4128d6a Binary files /dev/null and b/admin/favicon.ico differ diff --git a/admin/i18n/de/translations.json b/admin/i18n/de/translations.json deleted file mode 100644 index 3af120a..0000000 --- a/admin/i18n/de/translations.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "Add DB": "DB einfügen", - "Address": "Adresse", - "All entries will be deleted. Are you sure?": "Alle Einträge werden gelöscht. Sind sie sicher?", - "Close": "Zumachen", - "Delete all entries": "Alle Einträge löschen", - "Description": "Beschreibung", - "Enable polling of data point": "Zyklische Abfrage vom Datenpunkt", - "Export": "Export", - "Export to CSV": "Export in CSV", - "General": "Allgemein", - "Import": "Importieren", - "Import DB file:": "DB-Datei importieren:", - "Import from CSV": "Import aus CSV", - "Import symbols file:": "Symboldatei Importieren:", - "Inputs": "Eingänge", - "Length": "Länge", - "Load Symbols": "Lade Symbole", - "Local TSAP:": "Local TSAP:", - "Local time": "Ortszeit", - "Marker": "Merker", - "Name": "Name", - "Offset (no day saving time)": "Zeit-Offset (kein Sommerzeit)", - "Offset (with day saving time)": "Zeit-Offset (mit Sommerzeit)", - "Outputs": "Ausgänge", - "PLC Connection:": "SPS Verbindung:", - "PLC IP Address:": "SPS IP Adresse:", - "PLC Rack:": "SPS Rack:", - "PLC Slot:": "SPS Slot:", - "Poll delay:": "Poll delay:", - "Polling": "Umfrage", - "Pulse time:": "Pulsetime:", - "RW": "RW", - "Reconnect time:": "Reconnectzeit:", - "Remote TSAP:": "Remote TSAP:", - "Role": "Rolle", - "Room": "Raum", - "Round Real to:": "Aufrunden Real auf:", - "S7 LOGO!:": "S7 LOGO!:", - "S7 Time mode:": "S7-Zeitmodus", - "Text copied to clipboard. Click to close the window": "Text wurde in der Zwischenablage kopiert. Klick um Fenster zu zumachen.", - "Time offset:": "Zeitverschiebung:", - "Toggle RW": "RW umschalten", - "Toggle WP": "WP umschalten", - "Toggle poll": "Poll umschalten", - "Type": "Typ", - "UTC": "UTC", - "Unit": "Einheit", - "WP": "WP", - "Write access": "Schreibzugriff", - "Write access allowed": "Schreiben erlaubt", - "Write pulses (true=>false edge)": "Schreibe Pulse (Ja=>Nein Kante)", - "minutes": "Minuten", - "poll": "poll", - "sec": "Sek.", - "write as Pulse": "schreibe als Impuls" -} \ No newline at end of file diff --git a/admin/i18n/en/translations.json b/admin/i18n/en/translations.json deleted file mode 100644 index a9c5af9..0000000 --- a/admin/i18n/en/translations.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "Add DB": "Add DB", - "Address": "Address", - "All entries will be deleted. Are you sure?": "All entries will be deleted. Are you sure?", - "Close": "Close", - "Delete all entries": "Delete all entries", - "Description": "Description", - "Enable polling of data point": "Enable polling of data point", - "Export": "Export", - "Export to CSV": "Export to CSV", - "General": "General", - "Import": "Import", - "Import DB file:": "Import DB file:", - "Import from CSV": "Import from CSV", - "Import symbols file:": "Import symbols file:", - "Inputs": "Inputs", - "Length": "Length", - "Load Symbols": "Load symbols", - "Local TSAP:": "Local TSAP:", - "Local time": "Local time", - "Marker": "Marker", - "Name": "Name", - "Offset (no day saving time)": "Time offset (no day saving time)", - "Offset (with day saving time)": "Time offset (with day saving time)", - "Outputs": "Outputs", - "PLC Connection:": "PLC Connection:", - "PLC IP Address:": "PLC IP Address:", - "PLC Rack:": "PLC Rack:", - "PLC Slot:": "PLC Slot:", - "Poll delay:": "Poll delay:", - "Polling": "Polling", - "Pulse time:": "Pulse time:", - "RW": "RW", - "Reconnect time:": "Reconnect time:", - "Remote TSAP:": "Remote TSAP:", - "Role": "Role", - "Room": "Room", - "Round Real to:": "Round real to:", - "S7 LOGO!:": "S7 LOGO!:", - "S7 Time mode:": "S7 Time mode", - "Text copied to clipboard. Click to close the window": "Text copied to clipboard. Click to close the window", - "Time offset:": "Time offset:", - "Toggle RW": "Toggle RW", - "Toggle WP": "Toggle WP", - "Toggle poll": "Toggle poll", - "Type": "Type", - "UTC": "UTC", - "Unit": "Unit", - "WP": "WP", - "Write access": "Write access", - "Write access allowed": "Write access allowed", - "Write pulses (true=>false edge)": "Write pulses (true=>false edge)", - "minutes": "minutes", - "poll": "poll", - "sec": "sec.", - "write as Pulse": "write as Pulse" -} \ No newline at end of file diff --git a/admin/i18n/es/translations.json b/admin/i18n/es/translations.json deleted file mode 100644 index 3253e05..0000000 --- a/admin/i18n/es/translations.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "Add DB": "Add DB", - "Address": "Address", - "All entries will be deleted. Are you sure?": "All entries will be deleted. Are you sure?", - "Close": "Close", - "Delete all entries": "Delete all entries", - "Description": "Description", - "Enable polling of data point": "Enable polling of data point", - "Export": "Export", - "Export to CSV": "Export to CSV", - "General": "General", - "Import": "Import", - "Import DB file:": "Import DB file:", - "Import from CSV": "Import from CSV", - "Import symbols file:": "Import symbols file:", - "Inputs": "Inputs", - "Length": "Length", - "Load Symbols": "Load symbols", - "Local TSAP:": "Local TSAP:", - "Local time": "Hora local", - "Marker": "Marker", - "Name": "Name", - "Offset (no day saving time)": "Desplazamiento (sin horario de guardado)", - "Offset (with day saving time)": "Desplazamiento (con horario de ahorro de día)", - "Outputs": "Outputs", - "PLC Connection:": "PLC Connection:", - "PLC IP Address:": "PLC IP Address:", - "PLC Rack:": "PLC Rack:", - "PLC Slot:": "PLC Slot:", - "Poll delay:": "Poll delay:", - "Polling": "Votación", - "Pulse time:": "Pulse time:", - "RW": "RW", - "Reconnect time:": "Reconnect time:", - "Remote TSAP:": "Remote TSAP:", - "Role": "Role", - "Room": "Room", - "Round Real to:": "Round real to:", - "S7 LOGO!:": "S7 LOGO!:", - "S7 Time mode:": "Modo de tiempo S7", - "Text copied to clipboard. Click to close the window": "Text copied to clipboard. Click to close the window", - "Time offset:": "Desplazamiento de tiempo:", - "Toggle RW": "Toggle RW", - "Toggle WP": "Toggle WP", - "Toggle poll": "Toggle poll", - "Type": "Type", - "UTC": "UTC", - "Unit": "Unit", - "WP": "WP", - "Write access": "Acceso de escritura", - "Write access allowed": "Write access allowed", - "Write pulses (true=>false edge)": "Write pulses (true=>false edge)", - "minutes": "minutos", - "poll": "poll", - "sec": "sec.", - "write as Pulse": "escribe como Pulso" -} \ No newline at end of file diff --git a/admin/i18n/fr/translations.json b/admin/i18n/fr/translations.json deleted file mode 100644 index a372986..0000000 --- a/admin/i18n/fr/translations.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "Add DB": "Ajouter une DB", - "Address": "Adresse", - "All entries will be deleted. Are you sure?": "Toutes les entrées seront supprimées. Êtes-vous sûr?", - "Close": "Fermer", - "Delete all entries": "Supprimer toutes les entrées", - "Description": "La description", - "Enable polling of data point": "Activer l'interrogation du point de données", - "Export": "Exportation", - "Export to CSV": "Exporter au format CSV", - "General": "Général", - "Import": "Importer", - "Import DB file:": "Importer un fichier DB:", - "Import from CSV": "Importer à partir du fichier CSV", - "Import symbols file:": "Importer un fichier de symboles:", - "Inputs": "Contributions", - "Length": "Longueur", - "Load Symbols": "Charger des symboles", - "Local TSAP:": "TSAP local:", - "Local time": "Heure locale", - "Marker": "Marqueur", - "Name": "prénom", - "Offset (no day saving time)": "Décalage (pas de temps pour gagner du temps)", - "Offset (with day saving time)": "Décalage (avec un gain de temps de jour)", - "Outputs": "Les sorties", - "PLC Connection:": "Connexion PLC:", - "PLC IP Address:": "Adresse IP de l'API:", - "PLC Rack:": "Rack PLC:", - "PLC Slot:": "Slot PLC:", - "Poll delay:": "Délai d'interrogation:", - "Polling": "Vote", - "Pulse time:": "Temps d'impulsion:", - "RW": "RW", - "Reconnect time:": "Reconnectez le temps:", - "Remote TSAP:": "TSAP distant:", - "Role": "Rôle", - "Room": "Chambre", - "Round Real to:": "Rond réel à:", - "S7 LOGO!:": "S7 LOGO !:", - "S7 Time mode:": "S7 Mode heure", - "Text copied to clipboard. Click to close the window": "Texte copié dans le presse-papier Cliquez pour fermer la fenêtre", - "Time offset:": "Décalage temporel:", - "Toggle RW": "Toggle RW", - "Toggle WP": "Toggle WP", - "Toggle poll": "Basculer le sondage", - "Type": "Type", - "UTC": "UTC", - "Unit": "Unité", - "WP": "WP", - "Write access": "Accès en écriture", - "Write access allowed": "Accès en écriture autorisé", - "Write pulses (true=>false edge)": "Écrire des impulsions (true => false edge)", - "minutes": "minutes", - "poll": "sondage", - "sec": "seconde.", - "write as Pulse": "écrire comme Pulse" -} \ No newline at end of file diff --git a/admin/i18n/it/translations.json b/admin/i18n/it/translations.json deleted file mode 100644 index 8302674..0000000 --- a/admin/i18n/it/translations.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "Add DB": "Aggiungi DB", - "Address": "Indirizzo", - "All entries will be deleted. Are you sure?": "Tutte le voci saranno cancellate. Sei sicuro?", - "Close": "Vicino", - "Delete all entries": "Elimina tutte le voci", - "Description": "Descrizione", - "Enable polling of data point": "Abilita il polling del punto dati", - "Export": "Esportare", - "Export to CSV": "Esporta in CSV", - "General": "Generale", - "Import": "Importare", - "Import DB file:": "Importa file DB:", - "Import from CSV": "Importa da CSV", - "Import symbols file:": "Importa file simboli:", - "Inputs": "ingressi", - "Length": "Lunghezza", - "Load Symbols": "Carica simboli", - "Local TSAP:": "TSAP locale:", - "Local time": "Ora locale", - "Marker": "marcatore", - "Name": "Nome", - "Offset (no day saving time)": "Offset (nessun giorno risparmiando tempo)", - "Offset (with day saving time)": "Offset (con ora del giorno)", - "Outputs": "Uscite", - "PLC Connection:": "Connessione PLC:", - "PLC IP Address:": "Indirizzo IP del PLC:", - "PLC Rack:": "Rack PLC:", - "PLC Slot:": "Slot PLC:", - "Poll delay:": "Ritardo del sondaggio:", - "Polling": "votazione", - "Pulse time:": "Tempo di impulso:", - "RW": "RW", - "Reconnect time:": "Tempo di riconnessione:", - "Remote TSAP:": "TSAP remoto:", - "Role": "Ruolo", - "Room": "Camera", - "Round Real to:": "Round reale a:", - "S7 LOGO!:": "LOGO S7 !:", - "S7 Time mode:": "Modalità ora S7", - "Text copied to clipboard. Click to close the window": "Testo copiato negli appunti. Clicca per chiudere la finestra", - "Time offset:": "Differenza di fuso orario:", - "Toggle RW": "Attiva / disattiva RW", - "Toggle WP": "Attiva / disattiva WP", - "Toggle poll": "Attiva / disattiva sondaggio", - "Type": "genere", - "UTC": "UTC", - "Unit": "Unità", - "WP": "WP", - "Write access": "Accesso in scrittura", - "Write access allowed": "Accesso in scrittura consentito", - "Write pulses (true=>false edge)": "Scrivi impulsi (true => falso bordo)", - "minutes": "minuti", - "poll": "sondaggio", - "sec": "sec.", - "write as Pulse": "scrivi come Pulse" -} \ No newline at end of file diff --git a/admin/i18n/nl/translations.json b/admin/i18n/nl/translations.json deleted file mode 100644 index 7b1ba58..0000000 --- a/admin/i18n/nl/translations.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "Add DB": "Voeg DB toe", - "Address": "Adres", - "All entries will be deleted. Are you sure?": "Alle inzendingen worden verwijderd. Weet je het zeker?", - "Close": "Dichtbij", - "Delete all entries": "Verwijder alle vermeldingen", - "Description": "Beschrijving", - "Enable polling of data point": "Polling van gegevenspunt inschakelen", - "Export": "Exporteren", - "Export to CSV": "Exporteren naar CSV", - "General": "Algemeen", - "Import": "Importeren", - "Import DB file:": "DB-bestand importeren:", - "Import from CSV": "Importeren vanuit CSV", - "Import symbols file:": "Symboolbestand importeren:", - "Inputs": "ingangen", - "Length": "Lengte", - "Load Symbols": "Laad symbolen", - "Local TSAP:": "Lokale TSAP:", - "Local time": "Lokale tijd", - "Marker": "Markeerstift", - "Name": "Naam", - "Offset (no day saving time)": "Offset (geen dagbesparende tijd)", - "Offset (with day saving time)": "Offset (met dagbesparende tijd)", - "Outputs": "uitgangen", - "PLC Connection:": "PLC-verbinding:", - "PLC IP Address:": "PLC IP-adres:", - "PLC Rack:": "PLC Rack:", - "PLC Slot:": "PLC-slot:", - "Poll delay:": "Poll vertraging:", - "Polling": "stemming", - "Pulse time:": "Pulstijd:", - "RW": "RW", - "Reconnect time:": "Reconnect tijd:", - "Remote TSAP:": "TSAP op afstand:", - "Role": "Rol", - "Room": "Kamer", - "Round Real to:": "Rond echt naar:", - "S7 LOGO!:": "S7 LOGO !:", - "S7 Time mode:": "S7 Tijdmodus", - "Text copied to clipboard. Click to close the window": "Tekst gekopieerd naar klembord. Klik om het venster te sluiten", - "Time offset:": "Tijd offset:", - "Toggle RW": "RW omschakelen", - "Toggle WP": "Wissel WP", - "Toggle poll": "Poll wisselen", - "Type": "Type", - "UTC": "UTC", - "Unit": "Eenheid", - "WP": "WP", - "Write access": "Schrijf toegang", - "Write access allowed": "Schrijftoegang toegestaan", - "Write pulses (true=>false edge)": "Schrijf pulsen (true => false edge)", - "minutes": "minuut", - "poll": "poll", - "sec": "seconde", - "write as Pulse": "schrijf als Pulse" -} \ No newline at end of file diff --git a/admin/i18n/pl/translations.json b/admin/i18n/pl/translations.json deleted file mode 100644 index 7ba99da..0000000 --- a/admin/i18n/pl/translations.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "Add DB": "Dodaj DB", - "Address": "Adres", - "All entries will be deleted. Are you sure?": "Wszystkie wpisy zostaną usunięte. Jesteś pewny?", - "Close": "Blisko", - "Delete all entries": "Usuń wszystkie wpisy", - "Description": "Opis", - "Enable polling of data point": "Włącz odpytywanie punktu danych", - "Export": "Eksport", - "Export to CSV": "Eksportuj do pliku CSV", - "General": "Generał", - "Import": "Import", - "Import DB file:": "Importuj plik DB:", - "Import from CSV": "Importuj z CSV", - "Import symbols file:": "Importuj plik symboli:", - "Inputs": "Wejścia", - "Length": "Długość", - "Load Symbols": "Załaduj symbole", - "Local TSAP:": "Lokalny TSAP:", - "Local time": "Czas lokalny", - "Marker": "Znacznik", - "Name": "Nazwa", - "Offset (no day saving time)": "Przesunięcie (brak czasu na dzień)", - "Offset (with day saving time)": "Przesunięcie (z czasem oszczędzania dziennego)", - "Outputs": "Wyjścia", - "PLC Connection:": "Połączenie PLC:", - "PLC IP Address:": "Adres IP sterownika PLC:", - "PLC Rack:": "Rack PLC:", - "PLC Slot:": "Gniazdo PLC:", - "Poll delay:": "Opóźnienie ankiety:", - "Polling": "Ankieta", - "Pulse time:": "Czas impulsu:", - "RW": "RW", - "Reconnect time:": "Czas ponownego połączenia:", - "Remote TSAP:": "Zdalny TSAP:", - "Role": "Rola", - "Room": "Pokój", - "Round Real to:": "Runda prawdziwa do:", - "S7 LOGO!:": "S7 LOGO !:", - "S7 Time mode:": "S7 Tryb czasu", - "Text copied to clipboard. Click to close the window": "Tekst skopiowany do schowka. Kliknij, aby zamknąć okno", - "Time offset:": "Przesunięcie czasu:", - "Toggle RW": "Przełącz RW", - "Toggle WP": "Przełącz WP", - "Toggle poll": "Przełącz ankietę", - "Type": "Rodzaj", - "UTC": "UTC", - "Unit": "Jednostka", - "WP": "WP", - "Write access": "Dostęp do zapisu", - "Write access allowed": "Dostęp do zapisu dozwolony", - "Write pulses (true=>false edge)": "Pisz impulsy (true => false edge)", - "minutes": "minuty", - "poll": "głosowanie", - "sec": "sec.", - "write as Pulse": "napisz jako Pulse" -} \ No newline at end of file diff --git a/admin/i18n/pt/translations.json b/admin/i18n/pt/translations.json deleted file mode 100644 index c6b4eaa..0000000 --- a/admin/i18n/pt/translations.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "Add DB": "Adicionar DB", - "Address": "Endereço", - "All entries will be deleted. Are you sure?": "Todas as entradas serão excluídas. Você tem certeza?", - "Close": "Fechar", - "Delete all entries": "Eliminar todas as entradas", - "Description": "Descrição", - "Enable polling of data point": "Habilitar a votação do ponto de dados", - "Export": "Exportar", - "Export to CSV": "Exportar para CSV", - "General": "Geral", - "Import": "Importar", - "Import DB file:": "Importar arquivo DB:", - "Import from CSV": "Importação de CSV", - "Import symbols file:": "Arquivo de símbolos de importação:", - "Inputs": "Entradas", - "Length": "comprimento", - "Load Symbols": "Carregar símbolos", - "Local TSAP:": "TSAP local:", - "Local time": "Horário local", - "Marker": "Marcador", - "Name": "Nome", - "Offset (no day saving time)": "Deslocamento (sem horário)", - "Offset (with day saving time)": "Offset (com tempo de economia de hora)", - "Outputs": "Saídas", - "PLC Connection:": "Conexão do PLC:", - "PLC IP Address:": "Endereço IP do PLC:", - "PLC Rack:": "PLC Rack:", - "PLC Slot:": "Slot PLC:", - "Poll delay:": "Retardo de enquete:", - "Polling": "Polling", - "Pulse time:": "Tempo de pulso:", - "RW": "RW", - "Reconnect time:": "Reconectar o tempo:", - "Remote TSAP:": "TSAP remoto:", - "Role": "Função", - "Room": "Quarto", - "Round Real to:": "Round real to:", - "S7 LOGO!:": "S7 LOGO !:", - "S7 Time mode:": "Modo de tempo S7", - "Text copied to clipboard. Click to close the window": "Texto copiado para a área de transferência. Clique para fechar a janela", - "Time offset:": "Deslocamento de tempo:", - "Toggle RW": "Toggle RW", - "Toggle WP": "Toggle WP", - "Toggle poll": "Alternar pesquisa", - "Type": "Tipo", - "UTC": "UTC", - "Unit": "Unidade", - "WP": "WP", - "Write access": "Acesso de gravação", - "Write access allowed": "Acesso de acesso permitido", - "Write pulses (true=>false edge)": "Escrever pulsos (true => false edge)", - "minutes": "minutos", - "poll": "votação", - "sec": "seg.", - "write as Pulse": "escreva como pulso" -} \ No newline at end of file diff --git a/admin/i18n/ru/translations.json b/admin/i18n/ru/translations.json deleted file mode 100644 index e1d7b1a..0000000 --- a/admin/i18n/ru/translations.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "Add DB": "Добавить DB", - "Address": "Адрес", - "All entries will be deleted. Are you sure?": "Все элементы будут удалены. Вы уверенны?", - "Close": "Закрыть", - "Delete all entries": "Удалить все элементы", - "Description": "Описание", - "Enable polling of data point": "Постоянный опрос переменной в каждом цикле", - "Export": "Экспорт", - "Export to CSV": "Экспорт в CSV", - "General": "Основное", - "Import": "Ипмортировать", - "Import DB file:": "Ипморт DB файлов:", - "Import from CSV": "Импорт из CSV", - "Import symbols file:": "Ипморт символьных файлов:", - "Inputs": "Входы", - "Length": "Length", - "Load Symbols": "Загрузить символы", - "Local TSAP:": "Local TSAP:", - "Local time": "Местное время", - "Marker": "Маркеры", - "Name": "Имя", - "Offset (no day saving time)": "Сдвиг времени (без летнего времени)", - "Offset (with day saving time)": "Сдвиг времени (с летним временем)", - "Outputs": "Выходы", - "PLC Connection:": "PLC соединение:", - "PLC IP Address:": "PLC IP адрес:", - "PLC Rack:": "PLC Rack:", - "PLC Slot:": "PLC слот:", - "Poll delay:": "Интервал опроса:", - "Polling": "голосование", - "Pulse time:": "Pulse time:", - "RW": "RW", - "Reconnect time:": "Reconnect time:", - "Remote TSAP:": "Remote TSAP:", - "Role": "Роль", - "Room": "Комната", - "Round Real to:": "Округлять real до:", - "S7 LOGO!:": "S7 LOGO!:", - "S7 Time mode:": "S7 Режим времени", - "Text copied to clipboard. Click to close the window": "Текст скопирован в буфер обмена. Щелкните мышкой здесь, чтобы закрыть окно", - "Time offset:": "Смещение времени:", - "Toggle RW": "Изменить RW", - "Toggle WP": "Изменить WP", - "Toggle poll": "Изменить poll", - "Type": "Тип", - "UTC": "UTC", - "Unit": "Единицы", - "WP": "WP", - "Write access": "Доступ к записи", - "Write access allowed": "Разрешить запись в переменную", - "Write pulses (true=>false edge)": "Генерировать импульсы (1 => 0)", - "minutes": "минуты", - "poll": "poll", - "sec": "сек.", - "write as Pulse": "пишите как Pulse" -} \ No newline at end of file diff --git a/admin/i18n/zh-cn/translations.json b/admin/i18n/zh-cn/translations.json deleted file mode 100644 index 37ef2e3..0000000 --- a/admin/i18n/zh-cn/translations.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "Add DB": "添加数据库", - "Address": "地址", - "All entries will be deleted. Are you sure?": "所有条目将被删除。", - "Close": "关闭", - "Delete all entries": "删除所有条目", - "Description": "描述", - "Enable polling of data point": "启用数据点轮询", - "Export": "出口", - "Export to CSV": "导出为CSV", - "General": "一般的", - "Import": "进口", - "Import DB file:": "导入数据库文件:", - "Import from CSV": "从CSV导入", - "Import symbols file:": "导入符号文件:", - "Inputs": "输入项", - "Length": "长度", - "Load Symbols": "加载符号", - "Local TSAP:": "本地TSAP:", - "Local time": "当地时间", - "Marker": "记号笔", - "Name": "名称", - "Offset (no day saving time)": "时间偏移(无夏令时)", - "Offset (with day saving time)": "时间偏移(带夏时制)", - "Outputs": "产出", - "PLC Connection:": "PLC连接:", - "PLC IP Address:": "PLC IP地址:", - "PLC Rack:": "PLC机架:", - "PLC Slot:": "PLC插槽:", - "Poll delay:": "轮询延迟:", - "Polling": "轮询", - "Pulse time:": "脉冲时间:", - "RW": "读写器", - "Reconnect time:": "重新连接时间:", - "Remote TSAP:": "远程TSAP:", - "Role": "角色", - "Room": "房间", - "Round Real to:": "舍入为:", - "S7 LOGO!:": "S7 LOGO !:", - "S7 Time mode:": "S7时间模式", - "Text copied to clipboard. Click to close the window": "文本已复制到剪贴板。", - "Time offset:": "时间偏移:", - "Toggle RW": "切换RW", - "Toggle WP": "切换WP", - "Toggle poll": "切换民意调查", - "Type": "类型", - "UTC": "世界标准时间", - "Unit": "单元", - "WP": "可湿性粉剂", - "Write access": "写访问", - "Write access allowed": "允许写访问", - "Write pulses (true=>false edge)": "写脉冲(真=>假边)", - "minutes": "分钟", - "poll": "轮询", - "sec": "秒", - "write as Pulse": "写为脉冲" -} \ No newline at end of file diff --git a/admin/img/plc_back.png b/admin/img/plc_back.png deleted file mode 100644 index 143273f..0000000 Binary files a/admin/img/plc_back.png and /dev/null differ diff --git a/admin/index.html b/admin/index.html deleted file mode 100644 index 70b74d1..0000000 --- a/admin/index.html +++ /dev/null @@ -1,1305 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PLC Connection:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
General
ms
ms
ms
minutes
- - - - - - - - - - -
Import symbols file:Import DB file:
- - - -
-
-
-
- - - - - - -
-
-
-
-
- - - - - - -
-
-
-
-
- - - - - - -
-
-
- - - - - - - - -
-
- - - - - - -
-
-
- - -
- - diff --git a/admin/index_m.html b/admin/index_m.html new file mode 100644 index 0000000..872c7a1 --- /dev/null +++ b/admin/index_m.html @@ -0,0 +1 @@ +s7
\ No newline at end of file diff --git a/admin/lib/css/jsgrid-theme.css b/admin/lib/css/jsgrid-theme.css deleted file mode 100644 index 936950b..0000000 --- a/admin/lib/css/jsgrid-theme.css +++ /dev/null @@ -1,205 +0,0 @@ -/* - * jsGrid v1.0.1 (http://js-grid.com) - * (c) 2015 Artem Tabalin - * Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE) - */ - -.jsgrid-grid-header, -.jsgrid-grid-body, -.jsgrid-header-row > th, -.jsgrid-filter-row > td, -.jsgrid-insert-row > td, -.jsgrid-edit-row > td { - border: 1px solid #e9e9e9; -} - -.jsgrid-header-row > th { - border-top: 0; -} - -.jsgrid-header-row > th, .jsgrid-filter-row > td, .jsgrid-insert-row > td { - border-bottom: 0; -} - -.jsgrid-header-row > th:first-child, .jsgrid-filter-row > td:first-child, .jsgrid-insert-row > td:first-child { - border-left: none; -} - -.jsgrid-grid-header { - background: #f9f9f9; -} - -.jsgrid-header-sortable:hover { - cursor: pointer; - background: #fcfcfc; -} - -.jsgrid-header-row .jsgrid-header-sort { - background: #c4e2ff; -} - -.jsgrid-header-sort:before { - content: " "; - display: block; - float: left; - width: 0; - height: 0; - border-style: solid; -} - -.jsgrid-header-sort-asc:before { - border-width: 0 5px 5px 5px; - border-color: transparent transparent #009a67 transparent; -} - -.jsgrid-header-sort-desc:before { - border-width: 5px 5px 0 5px; - border-color: #009a67 transparent transparent transparent; -} - -.jsgrid-grid-body { - border-top: none; -} - -.jsgrid-grid-body td { - border: #f3f3f3 1px solid; -} - -.jsgrid-grid-body tr:first-child td { - border-top: none; -} - -.jsgrid-grid-body tr td:first-child { - border-left: none; -} - -.jsgrid-row > td { - background: #fff; -} - -.jsgrid-alt-row > td { - background: #fcfcfc; -} - -.jsgrid-header-row > th { - background: #f9f9f9; -} - -.jsgrid-filter-row > td { - background: #fcfcfc; -} - -.jsgrid-insert-row > td { - background: #e3ffe5; -} - -.jsgrid-edit-row > td { - background: #fdffe3; -} - -.jsgrid-selected-row > td { - background: #c4e2ff; - border-color: #c4e2ff; -} - -.jsgrid-nodata-row td { - background: #fff; -} - -.jsgrid-pager-current-page { - font-weight: bold; -} - -.jsgrid-button + .jsgrid-button { - margin-left: 5px; -} - -.jsgrid-button:hover { - opacity: .5; - transition: opacity 200ms linear; -} - -.jsgrid .jsgrid-button { - width: 16px; - height: 16px; - border: none; - cursor: pointer; - background-image: url(data:image/png;base64,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); - background-repeat: no-repeat; - background-color: transparent; -} - -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2) { - .jsgrid .jsgrid-button { - background-image: url(data:image/png;base64,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); - background-size: 24px 352px; - } -} - -.jsgrid .jsgrid-mode-button { - width: 24px; - height: 24px; -} - -.jsgrid-cancel-button { background-position: 0 0; width: 16px; height: 16px; } -.jsgrid-clear-filter-button { background-position: 0 -40px; width: 16px; height: 16px; } -.jsgrid-delete-button { background-position: 0 -80px; width: 16px; height: 16px; } -.jsgrid-edit-button { background-position: 0 -120px; width: 16px; height: 16px; } -.jsgrid-insert-mode-button { background-position: 0 -160px; width: 24px; height: 24px; } -.jsgrid-insert-button { background-position: 0 -208px; width: 16px; height: 16px; } -.jsgrid-search-mode-button { background-position: 0 -248px; width: 24px; height: 24px; } -.jsgrid-search-button { background-position: 0 -296px; width: 16px; height: 16px; } -.jsgrid-update-button { background-position: 0 -336px; width: 16px; height: 16px; } - - -.jsgrid-load-shader { - background: #ddd; - opacity: .5; - filter: alpha(opacity=50); -} - -.jsgrid-load-panel { - width: 15em; - height: 5em; - background: #fff; - border: 1px solid #e9e9e9; - padding-top: 3em; - text-align: center; -} - -.jsgrid-load-panel:before { - content: ' '; - position: absolute; - top: .5em; - left: 50%; - margin-left: -1em; - width: 2em; - height: 2em; - border: 2px solid #009a67; - border-right-color: transparent; - border-radius: 50%; - -webkit-animation: indicator 1s linear infinite; - animation: indicator 1s linear infinite; -} - -@-webkit-keyframes indicator -{ - from { -webkit-transform: rotate(0deg); } - 50% { -webkit-transform: rotate(180deg); } - to { -webkit-transform: rotate(360deg); } -} - -@keyframes indicator -{ - from { transform: rotate(0deg); } - 50% { transform: rotate(180deg); } - to { transform: rotate(360deg); } -} - -/* old IE */ -.jsgrid-load-panel { - padding-top: 1.5em \ ; -} -.jsgrid-load-panel:before { - display: none \ ; -} diff --git a/admin/lib/css/jsgrid-theme.min.css b/admin/lib/css/jsgrid-theme.min.css deleted file mode 100644 index 31e9c8c..0000000 --- a/admin/lib/css/jsgrid-theme.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/* - * jsGrid v1.0.1 (http://js-grid.com) - * (c) 2015 Artem Tabalin - * Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE) - */ - -.jsgrid-edit-row>td,.jsgrid-filter-row>td,.jsgrid-grid-body,.jsgrid-grid-header,.jsgrid-header-row>th,.jsgrid-insert-row>td{border:1px solid #e9e9e9}.jsgrid-header-row>th{border-top:0}.jsgrid-filter-row>td,.jsgrid-header-row>th,.jsgrid-insert-row>td{border-bottom:0}.jsgrid-filter-row>td:first-child,.jsgrid-header-row>th:first-child,.jsgrid-insert-row>td:first-child{border-left:none}.jsgrid-grid-header{background:#f9f9f9}.jsgrid-header-sortable:hover{cursor:pointer;background:#fcfcfc}.jsgrid-header-row .jsgrid-header-sort{background:#c4e2ff}.jsgrid-header-sort:before{content:" ";display:block;float:left;width:0;height:0;border-style:solid}.jsgrid-header-sort-asc:before{border-width:0 5px 5px;border-color:transparent transparent #009a67}.jsgrid-header-sort-desc:before{border-width:5px 5px 0;border-color:#009a67 transparent transparent}.jsgrid-grid-body{border-top:none}.jsgrid-grid-body td{border:1px solid #f3f3f3}.jsgrid-grid-body tr:first-child td{border-top:none}.jsgrid-grid-body tr td:first-child{border-left:none}.jsgrid-row>td{background:#fff}.jsgrid-alt-row>td{background:#fcfcfc}.jsgrid-header-row>th{background:#f9f9f9}.jsgrid-filter-row>td{background:#fcfcfc}.jsgrid-insert-row>td{background:#e3ffe5}.jsgrid-edit-row>td{background:#fdffe3}.jsgrid-selected-row>td{background:#c4e2ff;border-color:#c4e2ff}.jsgrid-nodata-row td{background:#fff}.jsgrid-pager-current-page{font-weight:700}.jsgrid-button+.jsgrid-button{margin-left:5px}.jsgrid-button:hover{opacity:.5;transition:opacity 200ms linear}.jsgrid .jsgrid-button{width:16px;height:16px;border:none;cursor:pointer;background-image:url(data:image/png;base64,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);background-repeat:no-repeat;background-color:transparent}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.jsgrid .jsgrid-button{background-image:url(data:image/png;base64,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);background-size:24px 352px}}.jsgrid .jsgrid-mode-button{width:24px;height:24px}.jsgrid-cancel-button{background-position:0 0;width:16px;height:16px}.jsgrid-clear-filter-button{background-position:0 -40px;width:16px;height:16px}.jsgrid-delete-button{background-position:0 -80px;width:16px;height:16px}.jsgrid-edit-button{background-position:0 -120px;width:16px;height:16px}.jsgrid-insert-mode-button{background-position:0 -160px;width:24px;height:24px}.jsgrid-insert-button{background-position:0 -208px;width:16px;height:16px}.jsgrid-search-mode-button{background-position:0 -248px;width:24px;height:24px}.jsgrid-search-button{background-position:0 -296px;width:16px;height:16px}.jsgrid-update-button{background-position:0 -336px;width:16px;height:16px}.jsgrid-load-shader{background:#ddd;opacity:.5;filter:alpha(opacity=50)}.jsgrid-load-panel{width:15em;height:5em;background:#fff;border:1px solid #e9e9e9;padding-top:3em;text-align:center}.jsgrid-load-panel:before{content:' ';position:absolute;top:.5em;left:50%;margin-left:-1em;width:2em;height:2em;border:2px solid #009a67;border-right-color:transparent;border-radius:50%;-webkit-animation:indicator 1s linear infinite;animation:indicator 1s linear infinite}@-webkit-keyframes indicator{from{-webkit-transform:rotate(0deg)}50%{-webkit-transform:rotate(180deg)}to{-webkit-transform:rotate(360deg)}}@keyframes indicator{from{transform:rotate(0deg)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}}.jsgrid-load-panel{padding-top:1.5em \}.jsgrid-load-panel:before{display:none \} \ No newline at end of file diff --git a/admin/lib/css/jsgrid.css b/admin/lib/css/jsgrid.css deleted file mode 100644 index 33fc780..0000000 --- a/admin/lib/css/jsgrid.css +++ /dev/null @@ -1,121 +0,0 @@ -/* - * jsGrid v1.0.1 (http://js-grid.com) - * (c) 2015 Artem Tabalin - * Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE) - */ - -.jsgrid { - position: relative; - overflow: hidden; - font-size: 1em; -} - -.jsgrid, .jsgrid *, .jsgrid *:before, .jsgrid *:after { - box-sizing: border-box; -} - -.jsgrid input, -.jsgrid textarea, -.jsgrid select { - font-size: 1em; -} - -.jsgrid-grid-header { - overflow-x: hidden; - overflow-y: hidden; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; -} - -.jsgrid-grid-body { - overflow-x: hidden; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; -} - -.jsgrid-table { - width: 100%; - table-layout: fixed; - border-collapse: collapse; - border-spacing: 0; -} - -.jsgrid-table td { - padding: 0.5em 0.5em; -} - -.jsgrid-table td, -.jsgrid-table th { - box-sizing: border-box; -} - -.jsgrid-align-left { - text-align: left; -} - -.jsgrid-align-center { - text-align: center; -} - -.jsgrid-align-right { - text-align: right; -} - -.jsgrid-header-row > th { - padding: .5em .5em; -} - -.jsgrid-filter-row input, -.jsgrid-filter-row textarea, -.jsgrid-filter-row select, -.jsgrid-edit-row input, -.jsgrid-edit-row textarea, -.jsgrid-edit-row select, -.jsgrid-insert-row input, -.jsgrid-insert-row textarea, -.jsgrid-insert-row select { - width: 90%; - padding: .3em .5em; -} - -.jsgrid-filter-row input[type='checkbox'], -.jsgrid-edit-row input[type='checkbox'], -.jsgrid-insert-row input[type='checkbox'] { - width: auto; -} - -.jsgrid-header-row > th, -.jsgrid-filter-row > td, -.jsgrid-insert-row > td, -.jsgrid-edit-row > td { - text-align: center; -} - -.jsgrid-selected-row td { - cursor: pointer; -} - -.jsgrid-nodata-row td { - padding: .5em 0; - text-align: center; -} - -.jsgrid-header-sort { - cursor: pointer; -} - -.jsgrid-pager { - padding: .5em 0; -} - -.jsgrid-pager-nav-button { - padding: .2em .6em; -} - -.jsgrid-pager-page { - padding: .2em .6em; -} \ No newline at end of file diff --git a/admin/lib/css/jsgrid.min.css b/admin/lib/css/jsgrid.min.css deleted file mode 100644 index 6463bb9..0000000 --- a/admin/lib/css/jsgrid.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/* - * jsGrid v1.0.1 (http://js-grid.com) - * (c) 2015 Artem Tabalin - * Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE) - */ - -.jsgrid{position:relative;overflow:hidden;font-size:1em}.jsgrid,.jsgrid *,.jsgrid :after,.jsgrid :before{box-sizing:border-box}.jsgrid input,.jsgrid select,.jsgrid textarea{font-size:1em}.jsgrid-grid-header{overflow-x:hidden;overflow-y:hidden;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.jsgrid-grid-body{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch}.jsgrid-table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0}.jsgrid-table td{padding:.5em}.jsgrid-table td,.jsgrid-table th{box-sizing:border-box}.jsgrid-align-left{text-align:left}.jsgrid-align-center{text-align:center}.jsgrid-align-right{text-align:right}.jsgrid-header-row>th{padding:.5em}.jsgrid-edit-row input,.jsgrid-edit-row select,.jsgrid-edit-row textarea,.jsgrid-filter-row input,.jsgrid-filter-row select,.jsgrid-filter-row textarea,.jsgrid-insert-row input,.jsgrid-insert-row select,.jsgrid-insert-row textarea{width:90%;padding:.3em .5em}.jsgrid-edit-row input[type=checkbox],.jsgrid-filter-row input[type=checkbox],.jsgrid-insert-row input[type=checkbox]{width:auto}.jsgrid-edit-row>td,.jsgrid-filter-row>td,.jsgrid-header-row>th,.jsgrid-insert-row>td{text-align:center}.jsgrid-selected-row td{cursor:pointer}.jsgrid-nodata-row td{padding:.5em 0;text-align:center}.jsgrid-header-sort{cursor:pointer}.jsgrid-pager{padding:.5em 0}.jsgrid-pager-nav-button,.jsgrid-pager-page{padding:.2em .6em} \ No newline at end of file diff --git a/admin/lib/js/grid.locale-de.js b/admin/lib/js/grid.locale-de.js deleted file mode 100644 index 9c07a68..0000000 --- a/admin/lib/js/grid.locale-de.js +++ /dev/null @@ -1,10 +0,0 @@ -function translate_de() { - window.jsGrid.Grid.prototype.noDataContent = "Nicht gefunden"; - window.jsGrid.Grid.prototype.deleteConfirm = "Sind Sie sicher?"; - window.jsGrid.Grid.prototype.pagerFormat = "Seiten = {first} {prev} {pages} {next} {last}    {pageIndex} of {pageCount}"; - window.jsGrid.Grid.prototype.pagePrevText = "Vorh."; - window.jsGrid.Grid.prototype.pageNextText = "Nexte"; - window.jsGrid.Grid.prototype.pageFirstText = "Erste"; - window.jsGrid.Grid.prototype.pageLastText = "Letzte"; - window.jsGrid.Grid.prototype.loadMessage = "Bitte; warten..."; -} \ No newline at end of file diff --git a/admin/lib/js/grid.locale-ru.js b/admin/lib/js/grid.locale-ru.js deleted file mode 100644 index 3d3fdf0..0000000 --- a/admin/lib/js/grid.locale-ru.js +++ /dev/null @@ -1,11 +0,0 @@ -function translate_ru() { - window.jsGrid.Grid.prototype.noDataContent = "Не найдено"; - window.jsGrid.Grid.prototype.deleteConfirm = "Вы уверены?"; - window.jsGrid.Grid.prototype.pagerFormat = "Страницы = {first} {prev} {pages} {next} {last}    {pageIndex} of {pageCount}"; - window.jsGrid.Grid.prototype.pagePrevText = "Пред."; - window.jsGrid.Grid.prototype.pageNextText = "След"; - window.jsGrid.Grid.prototype.pageFirstText = "Первая"; - window.jsGrid.Grid.prototype.pageLastText = "Последняя"; - window.jsGrid.Grid.prototype.loadMessage = "Подождите..."; -} - diff --git a/admin/lib/js/jsgrid.js b/admin/lib/js/jsgrid.js deleted file mode 100644 index 422a7ca..0000000 --- a/admin/lib/js/jsgrid.js +++ /dev/null @@ -1,1945 +0,0 @@ -/* - * jsGrid v1.0.1 (http://js-grid.com) - * (c) 2015 Artem Tabalin - * Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE) - */ - -(function(window, $, undefined) { - - var JSGRID = "JSGrid", - JSGRID_DATA_KEY = JSGRID, - JSGRID_ROW_DATA_KEY = "JSGridItem", - JSGRID_EDIT_ROW_DATA_KEY = "JSGridEditRow", - - SORT_ORDER_ASC = "asc", - SORT_ORDER_DESC = "desc", - - FIRST_PAGE_PLACEHOLDER = "{first}", - PAGES_PLACEHOLDER = "{pages}", - PREV_PAGE_PLACEHOLDER = "{prev}", - NEXT_PAGE_PLACEHOLDER = "{next}", - LAST_PAGE_PLACEHOLDER = "{last}", - PAGE_INDEX_PLACEHOLDER = "{pageIndex}", - PAGE_COUNT_PLACEHOLDER = "{pageCount}", - - EMPTY_HREF = "javascript:void(0);"; - - var getOrApply = function(value, context) { - if($.isFunction(value)) { - return value.apply(context, $.makeArray(arguments).slice(2)); - } - return value; - }; - - var defaultController = { - loadData: $.noop, - insertItem: $.noop, - updateItem: $.noop, - deleteItem: $.noop - }; - - - function Grid(element, config) { - var $element = $(element); - - $element.data(JSGRID_DATA_KEY, this); - - this._container = $element; - - this.data = []; - this.fields = []; - - this._editingRow = null; - this._sortField = null; - this._sortOrder = SORT_ORDER_ASC; - this._firstDisplayingPage = 1; - - this._init(config); - this.render(); - } - - Grid.prototype = { - width: "auto", - height: "auto", - updateOnResize: true, - - rowClass: $.noop, - rowRenderer: null, - - rowClick: function(args) { - if(this.editing) { - this.editItem($(args.event.target).closest("tr")); - } - }, - - noDataContent: "Not found", - noDataRowClass: "jsgrid-nodata-row", - - heading: true, - headerRowRenderer: null, - headerRowClass: "jsgrid-header-row", - - filtering: false, - filterRowRenderer: null, - filterRowClass: "jsgrid-filter-row", - - inserting: false, - insertRowRenderer: null, - insertRowClass: "jsgrid-insert-row", - - editing: false, - editRowRenderer: null, - editRowClass: "jsgrid-edit-row", - - confirmDeleting: true, - deleteConfirm: "Are you sure?", - - selecting: true, - selectedRowClass: "jsgrid-selected-row", - oddRowClass: "jsgrid-row", - evenRowClass: "jsgrid-alt-row", - - sorting: false, - sortableClass: "jsgrid-header-sortable", - sortAscClass: "jsgrid-header-sort jsgrid-header-sort-asc", - sortDescClass: "jsgrid-header-sort jsgrid-header-sort-desc", - - paging: false, - pagerContainer: null, - pageIndex: 1, - pageSize: 20, - pageButtonCount: 15, - pagerFormat: "Pages: {first} {prev} {pages} {next} {last}    {pageIndex} of {pageCount}", - pagePrevText: "Prev", - pageNextText: "Next", - pageFirstText: "First", - pageLastText: "Last", - pageNavigatorNextText: "...", - pageNavigatorPrevText: "...", - pagerContainerClass: "jsgrid-pager-container", - pagerClass: "jsgrid-pager", - pagerNavButtonClass: "jsgrid-pager-nav-button", - pageClass: "jsgrid-pager-page", - currentPageClass: "jsgrid-pager-current-page", - - pageLoading: false, - - autoload: false, - controller: defaultController, - - loadIndication: true, - loadIndicationDelay: 500, - loadMessage: "Please, wait...", - loadShading: true, - - onRefreshing: $.noop, - onRefreshed: $.noop, - onItemDeleting: $.noop, - onItemDeleted: $.noop, - onItemInserting: $.noop, - onItemInserted: $.noop, - onItemUpdating: $.noop, - onItemUpdated: $.noop, - onDataLoading: $.noop, - onDataLoaded: $.noop, - onOptionChanging: $.noop, - onOptionChanged: $.noop, - onError: $.noop, - - containerClass: "jsgrid", - tableClass: "jsgrid-table", - gridHeaderClass: "jsgrid-grid-header", - gridBodyClass: "jsgrid-grid-body", - - _init: function(config) { - $.extend(this, config); - this._initLoadStrategy(); - this._initController(); - this._initFields(); - this._attachWindowLoadResize(); - this._attachWindowResizeCallback(); - }, - - loadStrategy: function() { - return this.pageLoading - ? new jsGrid.loadStrategies.PageLoadingStrategy(this) - : new jsGrid.loadStrategies.DirectLoadingStrategy(this); - }, - - _initLoadStrategy: function() { - this._loadStrategy = getOrApply(this.loadStrategy, this); - }, - - _initController: function() { - this._controller = $.extend({}, defaultController, getOrApply(this.controller, this)); - }, - - loadIndicator: function(config) { - return new jsGrid.LoadIndicator(config); - }, - - _initFields: function() { - var self = this; - self.fields = $.map(self.fields, function(field) { - if($.isPlainObject(field)) { - var fieldConstructor = (field.type && jsGrid.fields[field.type]) || jsGrid.Field; - field = new fieldConstructor(field); - } - field._grid = self; - return field; - }); - }, - - _attachWindowLoadResize: function() { - $(window).on("load", $.proxy(this._refreshSize, this)); - }, - - _attachWindowResizeCallback: function() { - if(this.updateOnResize) { - $(window).on("resize", $.proxy(this._refreshSize, this)); - } - }, - - _detachWindowResizeCallback: function() { - $(window).off("resize", this._refreshSize); - }, - - option: function(key, value) { - var optionChangingEventArgs, - optionChangedEventArgs; - - if(arguments.length === 1) { - return this[key]; - } - - optionChangingEventArgs = { - option: key, - oldValue: this[key], - newValue: value - }; - this._callEventHandler(this.onOptionChanging, optionChangingEventArgs); - - this._handleOptionChange(optionChangingEventArgs.option, optionChangingEventArgs.newValue); - - optionChangedEventArgs = { - option: optionChangingEventArgs.option, - value: optionChangingEventArgs.newValue - }; - this._callEventHandler(this.onOptionChanged, optionChangedEventArgs); - }, - - _handleOptionChange: function(name, value) { - this[name] = value; - - switch(name) { - case "width": - case "height": - this._refreshSize(); - break; - case "rowClass": - case "rowRenderer": - case "rowClick": - case "noDataText": - case "noDataRowClass": - case "noDataContent": - case "selecting": - case "selectedRowClass": - case "oddRowClass": - case "evenRowClass": - this._refreshContent(); - break; - case "pageButtonCount": - case "pagerFormat": - case "pagePrevText": - case "pageNextText": - case "pageFirstText": - case "pageLastText": - case "pageNavigatorNextText": - case "pageNavigatorPrevText": - case "pagerClass": - case "pagerNavButtonClass": - case "pageClass": - case "currentPageClass": - this._refreshPager(); - break; - case "fields": - this._initFields(); - this.render(); - break; - case "data": - case "editing": - case "heading": - case "filtering": - case "inserting": - case "paging": - this.refresh(); - break; - case "pageLoading": - this._initLoadStrategy(); - this.search(); - break; - case "pageIndex": - this.openPage(value); - break; - case "pageSize": - this.refresh(); - this.search(); - break; - case "editRowRenderer": - case "editRowClass": - this.cancelEdit(); - break; - default: - this.render(); - break; - } - }, - - destroy: function() { - this._detachWindowResizeCallback(); - this._clear(); - this._container.removeData(JSGRID_DATA_KEY); - }, - - render: function() { - this._clear(); - - this._container.addClass(this.containerClass) - .css("position", "relative") - .append(this._createHeader()) - .append(this._createBody()); - - this._pagerContainer = this._createPagerContainer(); - this._loadIndicator = this._createLoadIndicator(); - - this.refresh(); - - return this.autoload ? this.loadData() : $.Deferred().resolve().promise(); - }, - - _createLoadIndicator: function() { - return getOrApply(this.loadIndicator, this, { - message: this.loadMessage, - shading: this.loadShading, - container: this._container - }); - }, - - _clear: function() { - this.cancelEdit(); - - clearTimeout(this._loadingTimer); - - this._pagerContainer && this._pagerContainer.empty(); - - this._container.empty() - .css({ position: "", width: "", height: "" }); - }, - - _createHeader: function() { - var $headerRow = this._headerRow = this._createHeaderRow(), - $filterRow = this._filterRow = this._createFilterRow(), - $insertRow = this._insertRow = this._createInsertRow(); - - var $headerGrid = this._headerGrid = $("").addClass(this.tableClass) - .append($headerRow) - .append($filterRow) - .append($insertRow); - - var $header = this._header = $("
").addClass(this.gridHeaderClass) - .append($headerGrid); - - return $header; - }, - - _createBody: function() { - var $content = this._content = $("
"); - - var $bodyGrid = this._bodyGrid = $("
").addClass(this.tableClass) - .append($content); - - var $body = this._body = $("
").addClass(this.gridBodyClass) - .append($bodyGrid); - - return $body; - }, - - _createPagerContainer: function() { - var pagerContainer = this.pagerContainer || $("
").appendTo(this._container); - return $(pagerContainer).addClass(this.pagerContainerClass); - }, - - _eachField: function(callBack) { - var self = this; - $.each(this.fields, function(index, field) { - return callBack.call(self, field, index); - }); - }, - - _createHeaderRow: function() { - if($.isFunction(this.headerRowRenderer)) { - return $(this.headerRowRenderer()); - } - - var $result = $("
").addClass(this.headerRowClass); - - this._eachField(function(field, index) { - var $th = $("").addClass(this.filterRowClass); - - this._eachField(function(field) { - $("").addClass(this.insertRowClass); - - this._eachField(function(field) { - $("").addClass(this.noDataRowClass) - .append($(""); - this._renderCells($result, item); - } - - $result.addClass(this._getRowClasses(item, itemIndex)) - .data(JSGRID_ROW_DATA_KEY, item) - .on("click", $.proxy(function(e) { - this.rowClick({ - item: item, - itemIndex: itemIndex, - event: e - }); - }, this)); - - if(this.selecting) { - this._attachRowHover($result); - } - - return $result; - }, - - _getRowClasses: function(item, itemIndex) { - var classes = []; - classes.push(((itemIndex + 1) % 2) ? this.oddRowClass : this.evenRowClass); - classes.push(getOrApply(this.rowClass, this, item, itemIndex)); - return classes.join(" "); - }, - - _attachRowHover: function($row) { - var selectedRowClass = this.selectedRowClass; - $row.hover(function() { - $(this).addClass(selectedRowClass); - }, - function() { - $(this).removeClass(selectedRowClass); - } - ); - }, - - _renderCells: function($row, item) { - this._eachField(function(field) { - $row.append(this._createCell(item, field)); - }); - return this; - }, - - _createCell: function(item, field) { - var $result; - var fieldValue = item[field.name]; - - if($.isFunction(field.cellRenderer)) { - $result = $(field.cellRenderer(fieldValue, item)); - } else { - $result = $("").addClass(this.editRowClass); - - this._eachField(function(field) { - $("
").addClass(field.css) - .appendTo($result) - .append(field.headerTemplate ? field.headerTemplate() : "") - .css("width", field.width); - - if(this.sorting && field.sorting) { - $th.addClass(this.sortableClass) - .on("click", $.proxy(function() { - this.sort(index); - }, this)); - } - }); - - return $result; - }, - - _createFilterRow: function() { - if($.isFunction(this.filterRowRenderer)) { - return $(this.filterRowRenderer()); - } - - var $result = $("
").addClass(field.css) - .appendTo($result) - .append(field.filterTemplate ? field.filterTemplate() : "") - .width(field.width); - }); - - return $result; - }, - - _createInsertRow: function() { - if($.isFunction(this.insertRowRenderer)) { - return $(this.insertRowRenderer()); - } - - var $result = $("
").addClass(field.css) - .appendTo($result) - .append(field.insertTemplate ? field.insertTemplate() : "") - .width(field.width); - }); - - return $result; - }, - - _callEventHandler: function(handler, eventParams) { - return handler.call(this, $.extend(eventParams, { - grid: this - })); - }, - - reset: function() { - this._resetSorting(); - this._resetPager(); - this.refresh(); - }, - - _resetPager: function() { - this._firstDisplayingPage = 1; - this._setPage(1); - }, - - _resetSorting: function() { - this._sortField = null; - this._sortOrder = SORT_ORDER_ASC; - this._clearSortingCss(); - }, - - refresh: function() { - this._callEventHandler(this.onRefreshing); - - this.cancelEdit(); - - this._refreshHeading(); - this._refreshFiltering(); - this._refreshInserting(); - this._refreshContent(); - this._refreshPager(); - this._refreshSize(); - - this._callEventHandler(this.onRefreshed); - }, - - _refreshHeading: function() { - this._headerRow.toggle(this.heading); - }, - - _refreshFiltering: function() { - this._filterRow.toggle(this.filtering); - }, - - _refreshInserting: function() { - this._insertRow.toggle(this.inserting); - }, - - _refreshContent: function() { - var $content = this._content; - $content.empty(); - - if(!this.data.length) { - $content.append(this._createNoDataRow()); - return this; - } - - var indexFrom = this._loadStrategy.firstDisplayIndex(); - var indexTo = this._loadStrategy.lastDisplayIndex(); - - for(var itemIndex = indexFrom; itemIndex < indexTo; itemIndex++) { - var item = this.data[itemIndex]; - $content.append(this._createRow(item, itemIndex)); - } - }, - - _createNoDataRow: function() { - var noDataContent = getOrApply(this.noDataContent, this); - return $("
").attr("colspan", this.fields.length).append(noDataContent)); - }, - - _createNoDataContent: function () { - return $.isFunction(this.noDataRenderer) - ? this.noDataRenderer() - : this.noDataText; - }, - - _createRow: function(item, itemIndex) { - var $result; - - if($.isFunction(this.rowRenderer)) { - $result = $(this.rowRenderer(item, itemIndex)); - } else { - $result = $("
").append(field.itemTemplate ? field.itemTemplate(fieldValue, item) : fieldValue); - } - - $result.addClass(field.css) - .width(field.width); - - field.align && $result.addClass("jsgrid-align-" + field.align); - - return $result; - }, - - sort: function(field, order) { - if($.isPlainObject(field)) { - order = field.order; - field = field.field; - } - - this._clearSortingCss(); - this._setSortingParams(field, order); - this._setSortingCss(); - return this._loadStrategy.sort(); - }, - - _clearSortingCss: function() { - this._headerRow.find("th") - .removeClass(this.sortAscClass) - .removeClass(this.sortDescClass); - }, - - _setSortingParams: function(field, order) { - field = this._normalizeSortingField(field); - order = order || ((this._sortField === field) ? this._reversedSortOrder(this._sortOrder) : SORT_ORDER_ASC); - - this._sortField = field; - this._sortOrder = order; - }, - - _normalizeSortingField: function(field) { - if($.isNumeric(field)) { - return this.fields[field]; - } - - if(typeof field === "string") { - return $.grep(this.fields, function (f) { - return f.name === field; - })[0]; - } - - return field; - }, - - _reversedSortOrder: function(order) { - return (order === SORT_ORDER_ASC ? SORT_ORDER_DESC : SORT_ORDER_ASC); - }, - - _setSortingCss: function() { - var fieldIndex = $.inArray(this._sortField, this.fields); - - this._headerRow.find("th").eq(fieldIndex) - .addClass(this._sortOrder === SORT_ORDER_ASC ? this.sortAscClass : this.sortDescClass); - }, - - _sortData: function() { - var sortFactor = this._sortFactor(), - sortField = this._sortField; - - if(sortField) { - this.data.sort(function(item1, item2) { - return sortFactor * sortField.sortingFunc(item1[sortField.name], item2[sortField.name]); - }); - } - }, - - _sortFactor: function() { - return this._sortOrder === SORT_ORDER_ASC ? 1 : -1; - }, - - _itemsCount: function() { - return this._loadStrategy.itemsCount(); - }, - - _pagesCount: function() { - var itemsCount = this._itemsCount(), - pageSize = this.pageSize; - return Math.floor(itemsCount / pageSize) + (itemsCount % pageSize ? 1 : 0); - }, - - _refreshPager: function() { - var $pagerContainer = this._pagerContainer; - $pagerContainer.empty(); - - if(this.paging && this._pagesCount() > 1) { - $pagerContainer.show() - .append(this._createPager()); - } else { - $pagerContainer.hide(); - } - }, - - _createPager: function() { - var pageIndex = this.pageIndex, - pageCount = this._pagesCount(), - pagerParts = this.pagerFormat.split(" "); - - pagerParts = $.map(pagerParts, $.proxy(function(pagerPart) { - var result = pagerPart; - - if(pagerPart === PAGES_PLACEHOLDER) { - result = this._createPages(); - } else if(pagerPart === FIRST_PAGE_PLACEHOLDER) { - result = pageIndex > 1 ? this._createPagerNavButton(this.pageFirstText, 1) : ""; - } else if(pagerPart === PREV_PAGE_PLACEHOLDER) { - result = pageIndex > 1 ? this._createPagerNavButton(this.pagePrevText, pageIndex - 1) : ""; - } else if(pagerPart === NEXT_PAGE_PLACEHOLDER) { - result = pageIndex < pageCount ? this._createPagerNavButton(this.pageNextText, pageIndex + 1) : ""; - } else if(pagerPart === LAST_PAGE_PLACEHOLDER) { - result = pageIndex < pageCount ? this._createPagerNavButton(this.pageLastText, pageCount) : ""; - } else if(pagerPart === PAGE_INDEX_PLACEHOLDER) { - result = pageIndex; - } else if(pagerPart === PAGE_COUNT_PLACEHOLDER) { - result = pageCount; - } - - return $.isArray(result) ? result.concat([" "]) : [result, " "]; - }, this)); - - var $pager = $("
").addClass(this.pagerClass) - .append(pagerParts); - - return $pager; - }, - - _createPages: function() { - var pageCount = this._pagesCount(), - pageButtonCount = this.pageButtonCount, - firstDisplayingPage = this._firstDisplayingPage, - pages = [], - pageNumber; - - if(firstDisplayingPage > 1) { - pages.push(this._createPagerPageNavButton(this.pageNavigatorPrevText, this.showPrevPages)); - } - - for(var i = 0, pageNumber = firstDisplayingPage; i < pageButtonCount && pageNumber <= pageCount; i++, pageNumber++) { - pages.push(pageNumber === this.pageIndex - ? this._createPagerCurrentPage() - : this._createPagerPage(pageNumber)); - } - - if((firstDisplayingPage + pageButtonCount - 1) < pageCount) { - pages.push(this._createPagerPageNavButton(this.pageNavigatorNextText, this.showNextPages)); - } - - return pages; - }, - - _createPagerNavButton: function(text, pageIndex) { - return this._createPagerButton(text, this.pagerNavButtonClass, function() { - this.openPage(pageIndex); - }); - }, - - _createPagerPageNavButton: function(text, handler) { - return this._createPagerButton(text, this.pagerNavButtonClass, handler); - }, - - _createPagerPage: function(pageIndex) { - return this._createPagerButton(pageIndex, this.pageClass, function() { - this.openPage(pageIndex); - }); - }, - - _createPagerButton: function(text, css, handler) { - var $link = $("").attr("href", EMPTY_HREF) - .html(text) - .on("click", $.proxy(handler, this)); - - return $("").addClass(css).append($link); - }, - - _createPagerCurrentPage: function() { - return $("") - .addClass(this.pageClass) - .addClass(this.currentPageClass) - .text(this.pageIndex); - }, - - _refreshSize: function() { - this._refreshHeight(); - this._refreshWidth(); - }, - - _refreshWidth: function() { - var $headerGrid = this._headerGrid, - $bodyGrid = this._bodyGrid, - width = this.width, - scrollBarWidth = this._scrollBarWidth(), - gridWidth; - - if(width === "auto") { - $headerGrid.width("auto"); - gridWidth = $headerGrid.outerWidth(); - width = gridWidth + scrollBarWidth; - } - - $headerGrid.width(""); - $bodyGrid.width(""); - this._header.css("padding-right", scrollBarWidth); - this._container.width(width); - gridWidth = $headerGrid.outerWidth(); - $bodyGrid.width(gridWidth); - }, - - _scrollBarWidth: (function() { - var result; - - return function() { - if(result === undefined) { - var $ghostContainer = $("
"); - var $ghostContent = $("
"); - $ghostContainer.append($ghostContent).appendTo("body"); - var width = $ghostContent.innerWidth(); - $ghostContainer.css("overflow-y", "auto"); - var widthExcludingScrollBar = $ghostContent.innerWidth(); - $ghostContainer.remove(); - result = width - widthExcludingScrollBar; - } - return result; - }; - })(), - - _refreshHeight: function() { - var container = this._container, - pagerContainer = this._pagerContainer, - height = this.height, - nonBodyHeight; - - container.height(height); - - if(height !== "auto") { - height = container.height(); - - nonBodyHeight = this._header.outerHeight(true); - if(pagerContainer.parents(container).length) { - nonBodyHeight += pagerContainer.outerHeight(true); - } - - this._body.outerHeight(height - nonBodyHeight); - } - }, - - showPrevPages: function() { - var firstDisplayingPage = this._firstDisplayingPage, - pageButtonCount = this.pageButtonCount; - - this._firstDisplayingPage = (firstDisplayingPage > pageButtonCount) ? firstDisplayingPage - pageButtonCount : 1; - - this._refreshPager(); - }, - - showNextPages: function() { - var firstDisplayingPage = this._firstDisplayingPage, - pageButtonCount = this.pageButtonCount, - pageCount = this._pagesCount(); - - this._firstDisplayingPage = (firstDisplayingPage + 2 * pageButtonCount > pageCount) - ? pageCount - pageButtonCount + 1 - : firstDisplayingPage + pageButtonCount; - - this._refreshPager(); - }, - - openPage: function(pageIndex) { - if(pageIndex < 1 || pageIndex > this._pagesCount()) - return; - - this._setPage(pageIndex); - this._loadStrategy.openPage(pageIndex); - }, - - _setPage: function(pageIndex) { - var firstDisplayingPage = this._firstDisplayingPage, - pageButtonCount = this.pageButtonCount; - - this.pageIndex = pageIndex; - - if(pageIndex < firstDisplayingPage) { - this._firstDisplayingPage = pageIndex; - } - - if(pageIndex > firstDisplayingPage + pageButtonCount - 1) { - this._firstDisplayingPage = pageIndex - pageButtonCount + 1; - } - }, - - _controllerCall: function(method, param, doneCallback) { - this._showLoading(); - - var controller = this._controller; - if(!controller || !controller[method]) { - throw new Error("controller has no method '" + method + "'"); - } - - return $.when(controller[method](param)) - .done($.proxy(doneCallback, this)) - .fail($.proxy(this._errorHandler, this)) - .always($.proxy(this._hideLoading, this)); - }, - - _errorHandler: function() { - this._callEventHandler(this.onError, { - args: $.makeArray(arguments) - }); - }, - - _showLoading: function() { - clearTimeout(this._loadingTimer); - - this._loadingTimer = setTimeout($.proxy(function() { - this._loadIndicator.show(); - }, this), this.loadIndicationDelay); - }, - - _hideLoading: function() { - clearTimeout(this._loadingTimer); - this._loadIndicator.hide(); - }, - - search: function(filter) { - this._resetSorting(); - this._resetPager(); - return this.loadData(filter); - }, - - loadData: function(filter) { - filter = filter || (this.filtering ? this._getFilter() : {}); - - $.extend(filter, this._loadStrategy.loadParams(), this._sortingParams()); - - this._callEventHandler(this.onDataLoading, { - filter: filter - }); - - return this._controllerCall("loadData", filter, function(loadedData) { - this._loadStrategy.finishLoad(loadedData); - - this._callEventHandler(this.onDataLoaded, { - data: loadedData - }); - }); - }, - - _getFilter: function() { - var result = {}; - this._eachField(function(field) { - if(field.filtering) { - result[field.name] = field.filterValue(); - } - }); - return result; - }, - - _sortingParams: function() { - if(this.sorting && this._sortField) { - return { - sortField: this._sortField.name, - sortOrder: this._sortOrder - }; - } - return {}; - }, - - clearFilter: function() { - var $filterRow = this._createFilterRow(); - this._filterRow.replaceWith($filterRow); - this._filterRow = $filterRow; - return this.search(); - }, - - insertItem: function(item) { - var insertingItem = item || this._getInsertItem(); - - this._callEventHandler(this.onItemInserting, { - item: insertingItem - }); - - return this._controllerCall("insertItem", insertingItem, function(insertedItem) { - insertedItem = insertedItem || insertingItem; - this._loadStrategy.finishInsert(insertedItem); - - this._callEventHandler(this.onItemInserted, { - item: insertedItem - }); - }); - }, - - _getInsertItem: function() { - var result = {}; - this._eachField(function(field) { - if(field.inserting) { - result[field.name] = field.insertValue(); - } - }); - return result; - }, - - clearInsert: function() { - var insertRow = this._createInsertRow(); - this._insertRow.replaceWith(insertRow); - this._insertRow = insertRow; - this.refresh(); - }, - - editItem: function(item) { - var $row = this._rowByItem(item); - if($row.length) { - this._editRow($row); - } - }, - - _rowByItem: function(item) { - if(item.jquery || item.nodeType) - return $(item); - - return this._content.find("tr").filter(function() { - return $.data(this, JSGRID_ROW_DATA_KEY) === item; - }); - }, - - _editRow: function($row) { - if(!this.editing) - return; - - if(this._editingRow) { - this.cancelEdit(); - } - - var item = $row.data(JSGRID_ROW_DATA_KEY), - $editRow = this._createEditRow(item); - - this._editingRow = $row; - $row.hide(); - $editRow.insertAfter($row); - $row.data(JSGRID_EDIT_ROW_DATA_KEY, $editRow); - }, - - _createEditRow: function(item) { - if($.isFunction(this.editRowRenderer)) { - return $(this.editRowRenderer(item, this._itemIndex(item))); - } - - var $result = $("
").addClass(field.css) - .appendTo($result) - .append(field.editTemplate ? field.editTemplate(item[field.name], item) : "") - .width(field.width || "auto"); - }); - - return $result; - }, - - updateItem: function(item, editedItem) { - if(arguments.length === 1) { - editedItem = item; - } - - var $row = item ? this._rowByItem(item) : this._editingRow; - editedItem = editedItem || this._getEditedItem(); - - return this._updateRow($row, editedItem); - }, - - _updateRow: function($updatingRow, editedItem) { - var updatingItem = $updatingRow.data(JSGRID_ROW_DATA_KEY), - updatingItemIndex = this._itemIndex(updatingItem); - - $.extend(updatingItem, editedItem); - - this._callEventHandler(this.onItemUpdating, { - row: $updatingRow, - item: updatingItem, - itemIndex: updatingItemIndex - }); - - return this._controllerCall("updateItem", updatingItem, function(updatedItem) { - updatedItem = updatedItem || updatingItem; - this._finishUpdate($updatingRow, updatedItem, updatingItemIndex); - - this._callEventHandler(this.onItemUpdated, { - row: $updatingRow, - item: updatedItem, - itemIndex: updatingItemIndex - }); - }); - }, - - _itemIndex: function(item) { - return $.inArray(item, this.data); - }, - - _finishUpdate: function($updatedRow, updatedItem, updatedItemIndex) { - this.cancelEdit(); - this.data[updatedItemIndex] = updatedItem; - $updatedRow.replaceWith(this._createRow(updatedItem, updatedItemIndex)); - }, - - _getEditedItem: function() { - var result = {}; - this._eachField(function(field) { - if(field.editing) { - result[field.name] = field.editValue(); - } - }); - return result; - }, - - cancelEdit: function() { - if(!this._editingRow) { - return; - } - - var $row = this._editingRow, - $editRow = $row.data(JSGRID_EDIT_ROW_DATA_KEY); - - $editRow.remove(); - $row.show(); - this._editingRow = null; - }, - - deleteItem: function(item) { - var $row = this._rowByItem(item); - - if(!$row.length) - return; - - if(this.confirmDeleting && !window.confirm(getOrApply(this.deleteConfirm, this, $row.data(JSGRID_ROW_DATA_KEY)))) - return; - - return this._deleteRow($row); - }, - - _deleteRow: function($row) { - var deletingItem = $row.data(JSGRID_ROW_DATA_KEY), - deletingItemIndex = this._itemIndex(deletingItem); - - this._callEventHandler(this.onItemDeleting, { - row: $row, - item: deletingItem, - itemIndex: deletingItemIndex - }); - - return this._controllerCall("deleteItem", deletingItem, function() { - this._loadStrategy.finishDelete(deletingItem, deletingItemIndex); - - this._callEventHandler(this.onItemDeleted, { - row: $row, - item: deletingItem, - itemIndex: deletingItemIndex - }); - }); - } - }; - - $.fn.jsGrid = function(config) { - var args = $.makeArray(arguments), - methodArgs = args.slice(1), - result = this; - - this.each(function() { - var $element = $(this), - instance = $element.data(JSGRID_DATA_KEY), - methodResult; - - if(instance) { - if(typeof config === "string") { - methodResult = instance[config].apply(instance, methodArgs); - if(methodResult !== undefined && methodResult !== instance) { - result = methodResult; - return false; - } - } else { - instance._detachWindowResizeCallback(); - instance._init(config); - instance.render(); - } - } else { - new Grid($element, config); - } - }); - - return result; - }; - - window.jsGrid = { - Grid: Grid, - fields: [] - }; - -}(window, jQuery)); -(function(jsGrid, $, undefined) { - - function LoadIndicator(config) { - this._init(config); - } - - LoadIndicator.prototype = { - - container: "body", - message: "Loading...", - shading: true, - - zIndex: 1000, - shaderClass: "jsgrid-load-shader", - loadPanelClass: "jsgrid-load-panel", - - _init: function(config) { - $.extend(true, this, config); - - this._initContainer(); - this._initShader(); - this._initLoadPanel(); - }, - - _initContainer: function() { - this._container = $(this.container); - }, - - _initShader: function() { - if(!this.shading) - return; - - this._shader = $("
").addClass(this.shaderClass) - .hide() - .css({ - position: "absolute", - top: 0, - right: 0, - bottom: 0, - left: 0, - zIndex: this.zIndex - }) - .appendTo(this._container); - }, - - _initLoadPanel: function() { - this._loadPanel = $("
").addClass(this.loadPanelClass) - .text(this.message) - .hide() - .css({ - position: "absolute", - top: "50%", - left: "50%", - zIndex: this.zIndex - }) - .appendTo(this._container); - }, - - show: function() { - var $loadPanel = this._loadPanel.show(); - - var actualWidth = $loadPanel.outerWidth(); - var actualHeight = $loadPanel.outerHeight(); - - $loadPanel.css({ - marginTop: -actualHeight / 2, - marginLeft: -actualWidth / 2 - }); - - this._shader.show(); - }, - - hide: function() { - this._loadPanel.hide(); - this._shader.hide(); - } - - }; - - jsGrid.LoadIndicator = LoadIndicator; - -}(jsGrid, jQuery)); -(function(jsGrid, $, undefined) { - - function DirectLoadingStrategy(grid) { - this._grid = grid; - } - - DirectLoadingStrategy.prototype = { - - firstDisplayIndex: function() { - var grid = this._grid; - return grid.option("paging") ? (grid.option("pageIndex") - 1) * grid.option("pageSize") : 0; - }, - - lastDisplayIndex: function() { - var grid = this._grid; - var itemsCount = grid.option("data").length; - - return grid.option("paging") - ? Math.min(grid.option("pageIndex") * grid.option("pageSize"), itemsCount) - : itemsCount; - }, - - itemsCount: function() { - return this._grid.option("data").length; - }, - - openPage: function(index) { - this._grid.refresh(); - }, - - loadParams: function() { - return {}; - }, - - sort: function() { - this._grid._sortData(); - this._grid.refresh(); - return $.Deferred().resolve().promise(); - }, - - finishLoad: function(loadedData) { - this._grid.option("data", loadedData); - }, - - finishInsert: function(insertedItem) { - var grid = this._grid; - grid.option("data").push(insertedItem); - grid.refresh(); - }, - - finishDelete: function(deletedItem, deletedItemIndex) { - var grid = this._grid; - grid.option("data").splice(deletedItemIndex, 1); - grid.reset(); - } - }; - - - function PageLoadingStrategy(grid) { - this._grid = grid; - this._itemsCount = 0; - } - - PageLoadingStrategy.prototype = { - firstDisplayIndex: function() { - return 0; - }, - - lastDisplayIndex: function() { - return this._grid.option("data").length; - }, - - itemsCount: function() { - return this._itemsCount; - }, - - openPage: function(index) { - this._grid.loadData(); - }, - - loadParams: function() { - var grid = this._grid; - return { - pageIndex: grid.option("pageIndex"), - pageSize: grid.option("pageSize") - }; - }, - - sort: function() { - return this._grid.loadData(); - }, - - finishLoad: function(loadedData) { - this._itemsCount = loadedData.itemsCount; - this._grid.option("data", loadedData.data); - }, - - finishInsert: function(insertedItem) { - this._grid.search(); - }, - - finishDelete: function(deletedItem, deletedItemIndex) { - this._grid.search(); - } - }; - - jsGrid.loadStrategies = { - DirectLoadingStrategy: DirectLoadingStrategy, - PageLoadingStrategy: PageLoadingStrategy - }; - -}(jsGrid, jQuery)); -(function(jsGrid, $, undefined) { - - var sortStrategies = { - string: function(str1, str2) { - return str1.localeCompare(str2); - }, - - number: function(n1, n2) { - return n1 - n2; - }, - - date: function(dt1, dt2) { - return dt1 - dt2; - }, - - numberAsString: function(n1, n2) { - return parseFloat(n1) - parseFloat(n2); - } - }; - - jsGrid.sortStrategies = sortStrategies; - -}(jsGrid, jQuery)); -(function(jsGrid, $, undefined) { - - function Field(config) { - $.extend(true, this, config); - this.sortingFunc = this._getSortingFunc(); - } - - Field.prototype = { - name: "", - title: "", - css: "", - align: "", - width: 100, - - filtering: true, - inserting: true, - editing: true, - sorting: true, - sorter: "string", // name of SortStrategy or function to compare elements - - headerTemplate: function() { - return this.title || this.name; - }, - - itemTemplate: function(value, item) { - return value; - }, - - filterTemplate: function() { - return ""; - }, - - insertTemplate: function() { - return ""; - }, - - editTemplate: function(value, item) { - this._value = value; - return this.itemTemplate(value, item); - }, - - filterValue: function() { - return ""; - }, - - insertValue: function() { - return ""; - }, - - editValue: function() { - return this._value; - }, - - _getSortingFunc: function() { - var sorter = this.sorter; - - if($.isFunction(sorter)) { - return sorter; - } - - if(typeof sorter === "string") { - return jsGrid.sortStrategies[sorter]; - } - - throw Error("Wrong sorter for the field \"" + this.name + "\"!"); - } - }; - - jsGrid.Field = Field; - -}(jsGrid, jQuery)); -(function(jsGrid, $, undefined) { - - var Field = jsGrid.Field; - - function TextField(config) { - Field.call(this, config); - } - - TextField.prototype = new Field({ - - autosearch: true, - - filterTemplate: function() { - var grid = this._grid, - $result = this.filterControl = this._createTextBox(); - - if(this.autosearch) { - $result.on("keypress", function(e) { - if(e.which === 13) { - grid.search(); - e.preventDefault(); - } - }); - } - - return $result; - }, - - insertTemplate: function() { - var $result = this.insertControl = this._createTextBox(); - return $result; - }, - - editTemplate: function(value) { - var $result = this.editControl = this._createTextBox(); - $result.val(value); - return $result; - }, - - filterValue: function() { - return this.filterControl.val(); - }, - - insertValue: function() { - return this.insertControl.val(); - }, - - editValue: function() { - return this.editControl.val(); - }, - - _createTextBox: function() { - return $("").attr("type", "text"); - } - }); - - jsGrid.fields.text = jsGrid.TextField = TextField; - -}(jsGrid, jQuery)); -(function(jsGrid, $, undefined) { - - var TextField = jsGrid.TextField; - - function NumberField(config) { - TextField.call(this, config); - } - - NumberField.prototype = new TextField({ - - sorter: "number", - align: "right", - - filterValue: function() { - return parseInt(this.filterControl.val() || 0, 10); - }, - - insertValue: function() { - return parseInt(this.insertControl.val() || 0, 10); - }, - - editValue: function() { - return parseInt(this.editControl.val() || 0, 10); - }, - - _createTextBox: function() { - return $("").attr("type", "number"); - } - }); - - jsGrid.fields.number = jsGrid.NumberField = NumberField; - -}(jsGrid, jQuery)); -(function(jsGrid, $, undefined) { - - var TextField = jsGrid.TextField; - - function TextAreaField(config) { - TextField.call(this, config); - } - - TextAreaField.prototype = new TextField({ - - insertTemplate: function() { - var $result = this.insertControl = this._createTextArea(); - return $result; - }, - - editTemplate: function(value) { - var $result = this.editControl = this._createTextArea(); - $result.val(value); - return $result; - }, - - _createTextArea: function() { - return $("