Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Single page aplication / 25 сообщений из 73, страница 1 из 3
10.04.2015, 14:06
    #38933071
Lolka1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Парни, можете посоветовать какие-нибудь мануалы по изучению SPA?
Сам не разработчик, но тут приспичило кое-что напрогать..
...
Рейтинг: 0 / 0
10.04.2015, 14:17
    #38933081
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
SPA - это не технология - это концепция.

Так что надо определиться сначала, на чем планируется реализовывать, а потом уже мануалы выбирать.
...
Рейтинг: 0 / 0
10.04.2015, 14:37
    #38933096
Lolka1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Shocker.Pro,

ASP.Net
...
Рейтинг: 0 / 0
10.04.2015, 14:41
    #38933101
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
ASP.Net WebForms? ASP.NET MVC?
...
Рейтинг: 0 / 0
10.04.2015, 14:47
    #38933106
Lolka1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Shocker.Pro,

MVC
...
Рейтинг: 0 / 0
10.04.2015, 14:54
    #38933120
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
...
Рейтинг: 0 / 0
10.04.2015, 14:54
    #38933123
Lolka1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Shocker.Pro,

Большое спасибо, начну изучать
...
Рейтинг: 0 / 0
10.04.2015, 15:06
    #38933139
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
...
Рейтинг: 0 / 0
12.04.2015, 00:27
    #38934005
Calabonga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Вот туториал по созданию своего собственного сайта на SPA
...
Рейтинг: 0 / 0
12.04.2015, 00:37
    #38934008
Calabonga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
...
Рейтинг: 0 / 0
13.04.2015, 03:40
    #38934397
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Calabonga
Что такое SPA или одностраничный портал

Breeze-то тут причём?
Кстати, он вроде бы тихо умер. По крайней мере, Джон Паппа - "папа" Бриза давно про него не вспоминает.
Человек только начинает, а вы ему втюхиваете свой венигрет всевозможных пакетов, непонятно зачем собранных вместе.
...
Рейтинг: 0 / 0
13.04.2015, 03:59
    #38934399
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Lolka1Парни, можете посоветовать какие-нибудь мануалы по изучению SPA?
Сам не разработчик, но тут приспичило кое-что напрогать..
наверное тогда лучше почитать про KnockoutJS, он наиболее простой.
...
Рейтинг: 0 / 0
13.04.2015, 05:39
    #38934407
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
buredLolka1Парни, можете посоветовать какие-нибудь мануалы по изучению SPA?
Сам не разработчик, но тут приспичило кое-что напрогать..
наверное тогда лучше почитать про KnockoutJS, он наиболее простой.

Какое отношение имеет KnockoutJS к SPA?
...
Рейтинг: 0 / 0
13.04.2015, 06:10
    #38934408
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
hVosttburedпропущено...

наверное тогда лучше почитать про KnockoutJS, он наиболее простой.

Какое отношение имеет KnockoutJS к SPA?На нём можно нужно построить SPA-фреймворк. :-)
...
Рейтинг: 0 / 0
13.04.2015, 06:17
    #38934411
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Алексей КНа нём можно нужно построить SPA-фреймворк. :-)

Ну дык и на VanillaJS тоже можно.. ))

Роутинг?
Модули?
DI?
Фабрики?
Модели?
REST/API?
Контроллеры?
Костная архитектура?

Нифига нет. Называется, засучивай рукава и пили. Если же хочется сосредоточиться на решении задачи, а не написании очередного велосипеда, надо брать нормальный SPA-фреймфорк и не выёживаться
...
Рейтинг: 0 / 0
13.04.2015, 06:29
    #38934412
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Алексей К,

2-ой ангуляр, кстати, запилен на расовом тайпскрипте, советую присмотреться и выкинуть эти свои поигрушки детсадовские на нокауте
...
Рейтинг: 0 / 0
13.04.2015, 06:47
    #38934414
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
hVosttАлексей КНа нём можно нужно построить SPA-фреймворк. :-)

Ну дык и на VanillaJS тоже можно.. ))

Роутинг?Что это? Зачем? Мне не надо.
hVosttМодули?AMD
hVosttDI?Мне не надо.
hVosttФабрики?Что это? Наверное, это есть в велосипеде.
hVosttМодели?Что это? Наверное, это есть в велосипеде.
hVosttREST/API?Да.
hVosttКонтроллеры?В последнем KO добавлен Component. Жаль, что поздно добавили, уже был написан свой велосипед.
hVosttКостная архитектура?Что за новая концепция?
hVosttНифига нет. Называется, засучивай рукава и пили.Ты программист, или где?
hVosttЕсли же хочется сосредоточиться на решении задачи, а не написании очередного велосипедаМне мой велосипед нравится больше.
hVosttнадо брать нормальный SPA-фреймфорк и не выёживаться Нормальных нет.
...
Рейтинг: 0 / 0
13.04.2015, 09:33
    #38934468
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Алексей КhVosttРоутинг?Что это? Зачем? Мне не надо.

Если ты не понимаешь что такое роутинг и зачем это надо, значит у тебя ещё нет опыта в разработке SPA.

Алексей КhVosttМодули?AMD

да, вижу что это есть.

Алексей КhVosttМодели?Что это? Наверное, это есть в велосипеде

получаешь данные, оборачиваешь во вью-модели? отправляешь, сериализуешь вью-модель в JSON?

Алексей КhVosttREST/API?Да.

не ври себе

Код: javascript
1.
2.
3.
4.
var data = /* Your data in JSON format - see below */;
$.post("/some/url", data, function(returnedData) {
    // This callback is executed if the post was successful     
})



Алексей КhVosttКостная архитектура?Что за новая концепция?

это значит, что тебе на надо думать над основной архитектурой, она уже есть из коробки. сразу пишешь модели, логику и шаблоны. не паришься как это всё организовать, даже структуру папок и файлов SPA фреймворк уже предусматривает.

для стороннего разработчика на типичной архитектуре фреймворка это означает возможность очень легко и быстро влиться в разработку, без вникания в дебри больной, безумной фантазии велосипедостроя (уж поверь мне, я ковырял твой Simple Solution Project, и самому ненавистному врагу не пожелаю поддерживать это или нечто подобное), а с фантазией обычно у авторов всё впорядке, не надо ни пить, ни курить, достаточно редактора кода

Алексей КТы программист, или где?

Я командный программист в первую очередь, для меня обеспечение комфортной разработки/сопровождения в команде в абсолютном приоритете. Что означает НЕТ велосипедам там, где можно обойтись без них. Чем меньше велосипедов, тем проще сопровождать и разрабатывать.

Алексей КНормальных нет.

У всех фатальный недостаток?
...
Рейтинг: 0 / 0
13.04.2015, 10:03
    #38934503
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
hVosttАлексей Кпропущено...
Что это? Зачем? Мне не надо.

Если ты не понимаешь что такое роутинг и зачем это надо, значит у тебя ещё нет опыта в разработке SPA.Я не обязан знать все названия.
hVosttАлексей Кпропущено...
Что это? Наверное, это есть в велосипеде

получаешь данные, оборачиваешь во вью-модели? отправляешь, сериализуешь вью-модель в JSON?Всё что для этого нужно пишется за 5 минут.

hVosttэто значит, что тебе на надо думать над основной архитектурой, она уже есть из коробки. сразу пишешь модели, логику и шаблоны. не паришься как это всё организовать, даже структуру папок и файлов SPA фреймворк уже предусматривает.Да.

hVosttдля стороннего разработчика на типичной архитектуре фреймворка это означает возможность очень легко и быстро влиться в разработкуТам масштабы не те. Изучается за неделю в худшем случае. В отличие от ангуларов и прочих.

hVostt, без вникания в дебри больной, безумной фантазии велосипедостроя (уж поверь мне, я ковырял твой Simple Solution Project, и самому ненавистному врагу не пожелаю поддерживать это или нечто подобное),Если взялся критиковать, то нужны конкретные замечания. Общих слов не достаточно.

hVostt а с фантазией обычно у авторов всё впорядке, не надо ни пить, ни курить, достаточно редактора кода Согласен, фантазия у авторов всяких Prism-ов и ангуларов безгранична.

hVosttАлексей КТы программист, или где?

Я командный программист в первую очередь, для меня обеспечение комфортной разработки/сопровождения в команде в абсолютном приоритете. Что означает НЕТ велосипедам там, где можно обойтись без них. Чем меньше велосипедов, тем проще сопровождать и разрабатывать.Согласен, если в команде нет нормальных разработчиков, способных разработать инструмент "под себя", то да, велосипедами лучше не заниматься.

hVosttАлексей КНормальных нет.

У всех фатальный недостаток? Раньше не было, может теперь уже и есть, но мне уже не актуально.
...
Рейтинг: 0 / 0
13.04.2015, 10:07
    #38934512
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Алексей К, гы, захотелось взглянуть на твой код :)
...
Рейтинг: 0 / 0
13.04.2015, 10:16
    #38934519
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Lolka1Сам не разработчик, но тут приспичило кое-что напрогать..

hVosttРоутинг?
Модули?
DI?
Фабрики?
Модели?
REST/API?
Контроллеры?
Костная архитектура?

Нифига нет. Называется, засучивай рукава и пили. Если же хочется сосредоточиться на решении задачи, а не написании очередного велосипеда, надо брать нормальный SPA-фреймфорк и не выёживаться
...
Рейтинг: 0 / 0
13.04.2015, 10:35
    #38934536
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
skyANAАлексей К, гы, захотелось взглянуть на твой код :)
Пожалуйста
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
export = Index;
import Roles = require("CurrentUser/Roles");
import HomeIndex = require("Home/Index");
import FavoritesSelector = require("Favorites/FavoritesSelector");

class Index extends ssp.IndexForm {
    directions = new ssp.DataSource({ url: "api/MessageTaskApi/GetDirections" });
    categories = new ssp.DataSource({ url: "api/MessageTaskApi/GetCategories" });
    projects = new ssp.DataSource({ url: "api/MessageTaskApi/GetProjects" });
    states = new ssp.DataSource({ url: "api/MessageTaskApi/GetStates" });
    favorites = new ssp.DataSource({ url: "api/MessageTaskApi/GetFavorites" });
    roles = new Roles();
    table: ssp.Table;

    constructor(parameters?) {
        super({
            templateUrl: ssp.url.getViewUrl("MessageTask/Index"),
            indexApiController: "api/MessageTaskApi",
            excelApiController: "api/MessageTaskExcelApi",
            editApiController: "api/MessageTaskEditApi",
            getRowID: row => row.ID,
            getRowName: row => row.Subject,
            dataConverter: data => {
                $.each(data.PageRows || [], (i, row) => {
                    row.IsTaskNotReaded = ko.observable(row.IsTaskNotReaded);
                });
            },
            filterConverter: filter => {
                var p = parameters || {};

                if (p.notReaded) {
                    filter.FilterType(0); // Текущие задачи
                    filter.F0_Category(1); // Непрочитанные
                    filter.F0_Direction(0); // Все задачи                    
                }
            }
        });

        var columns = [
            new ssp.TableColumn({
                header: "Тема",
                cellClass: row => "taskContent",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var c = new ssp.Control({ templateName: "messageTask-index-taskContent-template" });
                    c["data"] = row;
                    c["parent"] = this;
                    return c;
                }                
            }),
            new ssp.TableColumn({
                header: "Дата",
                tooltip: "Дата постановки задачи или последнего комментария.",
                propertyName: "ActivityDate",
                formatter: ssp.formatters.dateTime,
                cellClass: row => "auto-width"
            }),
            new ssp.TableColumn({
                header: "Постановщик",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var member = row.Sender;
                    return new ssp.Label(member.Name, member.IsMe ? ssp.Brands.Default : null);
                }
            }),
            new ssp.TableColumn({
                header: "Исполнитель",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var member = row.Recipient;
                    return new ssp.Label(member.Name, member.IsMe ? ssp.Brands.Default : null);
                }
            }),
            new ssp.TableColumn({
                header: "Состояние",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => new ssp.Label(row.CurrentStateStr, row.IsActive ? ssp.Brands.Success : ssp.Brands.Default)
            }),
            new ssp.TableColumn({
                header: "Проект",
                propertyName: "ProjectStr"
            })
        ];

        $.each(columns, (i, column) => {
            column.canSort = false;
        });

        var contextMenu = new ssp.GroupMenuItem({
            template: ssp.groupMenuItemTemplates.button,
            items: [
                new ssp.UrlMenuItem({
                    header: "Подробно",
                    url: row => row ? this.getDetailUrl(row) : ""
                }),
                new ssp.FuncMenuItem({
                    header: row => row ? row.IsTaskNotReaded() ? "Пометить как прочтённое" : "Пометить как непрочтённое" : "",
                    func: row => { this.inverseIsTaskReaded(row); },
                    isEnabled: row => row && row.MustReadMessage
                }),
                new ssp.SeparatorMenuItem({
                    isVisible: () =>
                        this.roles.isInRole(this.roles.appRoles.message_task) ||
                        this.roles.isInRole(this.roles.appRoles.message_task_delete)
                }),
                new ssp.UrlMenuItem({
                    header: "Изменить",
                    url: row => row ? ssp.url.getDocUrl("MessageTask/Edit", { id: this.getRowID(row) }) : "",
                    isVisible: () => this.roles.isInRole(this.roles.appRoles.message_task),
                    isEnabled: row => row && row.CanChangeMessage
                }),
                new ssp.FuncMenuItem({
                    header: "Удалить",
                    func: row => { this.delete(row); },
                    isVisible: () => this.roles.isInRole(this.roles.appRoles.message_task_delete),
                    isEnabled: row => row && row.CanChangeMessage
                }),
                new ssp.SeparatorMenuItem(),
                new ssp.FuncMenuItem({
                    header: "Добавить в избранное",
                    func: row => { this.addToFavorite(row); }
                }),
                new ssp.FuncMenuItem({
                    header: "Удалить из избранного",
                    func: row => { this.deleteFromFavorite(row); },
                    isEnabled: () => {
                        var filter = this.filter.result();
                        return filter && filter.FilterType() == 1 /*Избранное*/ && filter.F1_FavID()
                    }
                })
            ]
        });

        this.table = new ssp.Table({
            addUrl: ssp.url.getDocUrl("MessageTask/Edit"),
            isAddVisible: () => this.roles.isInRole(this.roles.appRoles.message_task),
            dataSource: this.data,
            columns: columns,
            contextMenu: contextMenu
        });
    }

    getDetailUrl(row) {
        return ssp.url.getDocUrl("MessageTask/Detail", { id: row.ID });
    }

    inverseIsTaskReaded(row) {
        ssp.ajax
            .postJson("api/MessageApi/SetMessageReadedByID", { ID: this.getRowID(row), IsReaded: row.IsTaskNotReaded() })
            .done(() => {
                row.IsTaskNotReaded(!row.IsTaskNotReaded());
                HomeIndex.model.notReadedAlert.refresh();
                this.data.refreshImmediate();
            });
    }

    addToFavorite(row) {
        new FavoritesSelector()
            .select(selectedItem => {
                return ssp.ajax
                    .postJson("api/MessageTaskFavoritesApi/AddToFavorite", { TaskID: row.ID, FavID: selectedItem.ID })
                    .done(() => { this.data.refreshImmediate(); });
            });
    }

    deleteFromFavorite(row) {
        var favID = this.filter.result().F1_FavID();
        var favCaption = "";

        $.each(this.favorites.result() || [], (i, v) => {
            if (v.ID == favID) {
                favCaption = v.Caption;
                return false;
            }
        });

        var msg = "Задача будет исключена из категории избранного \"" + favCaption + "\". Продолжить?";

        ssp.commonDialogs
            .ask(msg)
            .done(() => {
                ssp.ajax
                    .postJson("api/MessageTaskFavoritesApi/DeleteFromFavorite", { TaskID: row.ID, FavID: favID })
                    .done(() => { this.data.refreshImmediate(); });
            });
    }
}

...
Рейтинг: 0 / 0
13.04.2015, 10:41
    #38934539
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Алексей КЯ не обязан знать все названия.

Нет конечно.

Алексей КТам масштабы не те. Изучается за неделю в худшем случае. В отличие от ангуларов и прочих.

Ну дык зачем ты советуешь людЯм заниматься велосепедостроительством? Человек, изучивший хорошо Ангуляр найдёт работу максимум на неделю, и ЗП будет не обижен. А знающий только нокаут, вообще сомневаюсь что хоть что-то найдёт... Такие знания нафиг никому не упёрлись.

Алексей КЕсли взялся критиковать, то нужны конкретные замечания. Общих слов не достаточно.

Я не критикую, я привожу пример того, что получается, когда одиночки делают свою архитектуру. Ты бы ещё больше слоёв там добавил, а то явно их недостаточно Это не критика, это факт, так оно обычно и получается.

Алексей КСогласен, фантазия у авторов всяких Prism-ов и ангуларов безгранична.

Ангуляр блетсящий пример, кстати. Вроде и команда дикая и поддержка гугловская и коммьюнити огромное, но на выходе, по крайне мере ветки 1.x получается весьма далёкая от идеала архитектура. Мне не нравится 1.x, очень много претензий. Но однако при всё при этом даже она в плюсе перед велосипедами в 95% случаев.

2.x ещё подробно не ковырял, но судя по поверхностному обзору, работа над ошибками была проведена существенная, похоже эта версия мне даже понравится.
...
Рейтинг: 0 / 0
13.04.2015, 10:54
    #38934553
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
hVosttАлексей КТам масштабы не те. Изучается за неделю в худшем случае. В отличие от ангуларов и прочих.

Ну дык зачем ты советуешь людЯм заниматься велосепедостроительством?Я никому ничего не советую. Я делюсь своим мнением.
hVosttЧеловек, изучивший хорошо Ангуляр найдёт работу максимум на неделю, и ЗП будет не обижен.Ангулар будет изучен при необходимости максимум за неделю. Но зачем мне это?
hVosttА знающий только нокаут, вообще сомневаюсь что хоть что-то найдёт... Такие знания нафиг никому не упёрлись.Если контора отличает кандидатов по знанию "ангуларов", то её кадровая политика бездарна, делать в такой конторе нечего.
hVosttАлексей КЕсли взялся критиковать, то нужны конкретные замечания. Общих слов не достаточно.

Я не критикую, я привожу пример того, что получается, когда одиночки делают свою архитектуру.А меж тем эта архитектура прекрасно показала себя на практике. Да и архитектуры там как-таковой практически нет. Всё базируется на стандартной архитектуре приложений под WPF/WCF/EF, с некоторым расширениями.
hVosttТы бы ещё больше слоёв там добавил, а то явно их недостаточно Это не критика, это факт, так оно обычно и получается.Фактов не увидел.
hVosttАлексей КСогласен, фантазия у авторов всяких Prism-ов и ангуларов безгранична.

Ангуляр блетсящий пример, кстати. Вроде и команда дикая и поддержка гугловская и коммьюнити огромное, но на выходе, по крайне мере ветки 1.x получается весьма далёкая от идеала архитектура. Мне не нравится 1.x, очень много претензий. Но однако при всё при этом даже она в плюсе перед велосипедами в 95% случаев.

2.x ещё подробно не ковырял, но судя по поверхностному обзору, работа над ошибками была проведена существенная, похоже эта версия мне даже понравится.Через год будет версия 3.x, потом 4.x, наверняка без обратной совместимости. Потом всё успешно загнётся, когда у гугла появится новая игрушка.
...
Рейтинг: 0 / 0
13.04.2015, 11:25
    #38934579
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Single page aplication
Алексей КskyANAАлексей К, гы, захотелось взглянуть на твой код :)
Пожалуйста
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
export = Index;
import Roles = require("CurrentUser/Roles");
import HomeIndex = require("Home/Index");
import FavoritesSelector = require("Favorites/FavoritesSelector");

class Index extends ssp.IndexForm {
    directions = new ssp.DataSource({ url: "api/MessageTaskApi/GetDirections" });
    categories = new ssp.DataSource({ url: "api/MessageTaskApi/GetCategories" });
    projects = new ssp.DataSource({ url: "api/MessageTaskApi/GetProjects" });
    states = new ssp.DataSource({ url: "api/MessageTaskApi/GetStates" });
    favorites = new ssp.DataSource({ url: "api/MessageTaskApi/GetFavorites" });
    roles = new Roles();
    table: ssp.Table;

    constructor(parameters?) {
        super({
            templateUrl: ssp.url.getViewUrl("MessageTask/Index"),
            indexApiController: "api/MessageTaskApi",
            excelApiController: "api/MessageTaskExcelApi",
            editApiController: "api/MessageTaskEditApi",
            getRowID: row => row.ID,
            getRowName: row => row.Subject,
            dataConverter: data => {
                $.each(data.PageRows || [], (i, row) => {
                    row.IsTaskNotReaded = ko.observable(row.IsTaskNotReaded);
                });
            },
            filterConverter: filter => {
                var p = parameters || {};

                if (p.notReaded) {
                    filter.FilterType(0); // Текущие задачи
                    filter.F0_Category(1); // Непрочитанные
                    filter.F0_Direction(0); // Все задачи                    
                }
            }
        });

        var columns = [
            new ssp.TableColumn({
                header: "Тема",
                cellClass: row => "taskContent",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var c = new ssp.Control({ templateName: "messageTask-index-taskContent-template" });
                    c["data"] = row;
                    c["parent"] = this;
                    return c;
                }                
            }),
            new ssp.TableColumn({
                header: "Дата",
                tooltip: "Дата постановки задачи или последнего комментария.",
                propertyName: "ActivityDate",
                formatter: ssp.formatters.dateTime,
                cellClass: row => "auto-width"
            }),
            new ssp.TableColumn({
                header: "Постановщик",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var member = row.Sender;
                    return new ssp.Label(member.Name, member.IsMe ? ssp.Brands.Default : null);
                }
            }),
            new ssp.TableColumn({
                header: "Исполнитель",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var member = row.Recipient;
                    return new ssp.Label(member.Name, member.IsMe ? ssp.Brands.Default : null);
                }
            }),
            new ssp.TableColumn({
                header: "Состояние",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => new ssp.Label(row.CurrentStateStr, row.IsActive ? ssp.Brands.Success : ssp.Brands.Default)
            }),
            new ssp.TableColumn({
                header: "Проект",
                propertyName: "ProjectStr"
            })
        ];

        $.each(columns, (i, column) => {
            column.canSort = false;
        });

        var contextMenu = new ssp.GroupMenuItem({
            template: ssp.groupMenuItemTemplates.button,
            items: [
                new ssp.UrlMenuItem({
                    header: "Подробно",
                    url: row => row ? this.getDetailUrl(row) : ""
                }),
                new ssp.FuncMenuItem({
                    header: row => row ? row.IsTaskNotReaded() ? "Пометить как прочтённое" : "Пометить как непрочтённое" : "",
                    func: row => { this.inverseIsTaskReaded(row); },
                    isEnabled: row => row && row.MustReadMessage
                }),
                new ssp.SeparatorMenuItem({
                    isVisible: () =>
                        this.roles.isInRole(this.roles.appRoles.message_task) ||
                        this.roles.isInRole(this.roles.appRoles.message_task_delete)
                }),
                new ssp.UrlMenuItem({
                    header: "Изменить",
                    url: row => row ? ssp.url.getDocUrl("MessageTask/Edit", { id: this.getRowID(row) }) : "",
                    isVisible: () => this.roles.isInRole(this.roles.appRoles.message_task),
                    isEnabled: row => row && row.CanChangeMessage
                }),
                new ssp.FuncMenuItem({
                    header: "Удалить",
                    func: row => { this.delete(row); },
                    isVisible: () => this.roles.isInRole(this.roles.appRoles.message_task_delete),
                    isEnabled: row => row && row.CanChangeMessage
                }),
                new ssp.SeparatorMenuItem(),
                new ssp.FuncMenuItem({
                    header: "Добавить в избранное",
                    func: row => { this.addToFavorite(row); }
                }),
                new ssp.FuncMenuItem({
                    header: "Удалить из избранного",
                    func: row => { this.deleteFromFavorite(row); },
                    isEnabled: () => {
                        var filter = this.filter.result();
                        return filter && filter.FilterType() == 1 /*Избранное*/ && filter.F1_FavID()
                    }
                })
            ]
        });

        this.table = new ssp.Table({
            addUrl: ssp.url.getDocUrl("MessageTask/Edit"),
            isAddVisible: () => this.roles.isInRole(this.roles.appRoles.message_task),
            dataSource: this.data,
            columns: columns,
            contextMenu: contextMenu
        });
    }

    getDetailUrl(row) {
        return ssp.url.getDocUrl("MessageTask/Detail", { id: row.ID });
    }

    inverseIsTaskReaded(row) {
        ssp.ajax
            .postJson("api/MessageApi/SetMessageReadedByID", { ID: this.getRowID(row), IsReaded: row.IsTaskNotReaded() })
            .done(() => {
                row.IsTaskNotReaded(!row.IsTaskNotReaded());
                HomeIndex.model.notReadedAlert.refresh();
                this.data.refreshImmediate();
            });
    }

    addToFavorite(row) {
        new FavoritesSelector()
            .select(selectedItem => {
                return ssp.ajax
                    .postJson("api/MessageTaskFavoritesApi/AddToFavorite", { TaskID: row.ID, FavID: selectedItem.ID })
                    .done(() => { this.data.refreshImmediate(); });
            });
    }

    deleteFromFavorite(row) {
        var favID = this.filter.result().F1_FavID();
        var favCaption = "";

        $.each(this.favorites.result() || [], (i, v) => {
            if (v.ID == favID) {
                favCaption = v.Caption;
                return false;
            }
        });

        var msg = "Задача будет исключена из категории избранного \"" + favCaption + "\". Продолжить?";

        ssp.commonDialogs
            .ask(msg)
            .done(() => {
                ssp.ajax
                    .postJson("api/MessageTaskFavoritesApi/DeleteFromFavorite", { TaskID: row.ID, FavID: favID })
                    .done(() => { this.data.refreshImmediate(); });
            });
    }
}

Очередной Smart UI.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Single page aplication / 25 сообщений из 73, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]