From 3395a30c1221e4b89081893c2f9303160e95587b Mon Sep 17 00:00:00 2001 From: Sanjay Date: Tue, 13 Jul 2021 16:47:57 +0530 Subject: [PATCH 1/5] Improve date format selection UI #66 --- server/meeting.go | 9 ++- server/meeting_test.go | 22 +++--- .../meeting_settings/meeting_settings.jsx | 76 ++++++++++++++----- 3 files changed, 76 insertions(+), 31 deletions(-) diff --git a/server/meeting.go b/server/meeting.go index 7bfad8b..eed7c10 100644 --- a/server/meeting.go +++ b/server/meeting.go @@ -16,7 +16,7 @@ var ( type Meeting struct { ChannelID string `json:"channelId"` Schedule []time.Weekday `json:"schedule"` - HashtagFormat string `json:"hashtagFormat"` // Default: {ChannelName}-Jan02 + HashtagFormat string `json:"hashtagFormat"` // Default: {ChannelName}-Jan-2 } // GetMeeting returns a meeting @@ -37,9 +37,10 @@ func (p *Plugin) GetMeeting(channelID string) (*Meeting, error) { if err != nil { return nil, err } + paddedChannelName := strings.ReplaceAll(channel.Name, "-", "_") meeting = &Meeting{ Schedule: []time.Weekday{time.Thursday}, - HashtagFormat: strings.Join([]string{fmt.Sprintf("%.15s", channel.Name), "{{ Jan02 }}"}, "-"), + HashtagFormat: strings.Join([]string{fmt.Sprintf("%.15s", paddedChannelName), "{{ Jan 2 }}"}, "_"), ChannelID: channelID, } } @@ -92,8 +93,10 @@ func (p *Plugin) GenerateHashtag(channelID string, nextWeek bool, weekday int) ( prefix = matchGroups[1] hashtagFormat = strings.TrimSpace(matchGroups[2]) postfix = matchGroups[3] + formattedDate := meetingDate.Format(hashtagFormat) + formattedDate = strings.ReplaceAll(formattedDate, " ", "_") - hashtag = fmt.Sprintf("#%s%v%s", prefix, meetingDate.Format(hashtagFormat), postfix) + hashtag = fmt.Sprintf("#%s%v%s", prefix, formattedDate, postfix) } else { hashtag = fmt.Sprintf("#%s", meeting.HashtagFormat) } diff --git a/server/meeting_test.go b/server/meeting_test.go index 4e24e25..a8b5b72 100644 --- a/server/meeting_test.go +++ b/server/meeting_test.go @@ -55,9 +55,9 @@ func TestPlugin_GenerateHashtag(t *testing.T) { meeting: &Meeting{ ChannelID: "QA", Schedule: []time.Weekday{time.Wednesday}, - HashtagFormat: "{{Jan02}}", + HashtagFormat: "{{Jan 2}}", }}, - want: "#" + assertNextWeekdayDate(time.Wednesday, true).Format("Jan02"), + want: "#" + strings.ReplaceAll(assertNextWeekdayDate(time.Wednesday, true).Format("Jan 2"), " ", "_"), wantErr: false, }, { @@ -67,9 +67,9 @@ func TestPlugin_GenerateHashtag(t *testing.T) { meeting: &Meeting{ ChannelID: "QA Backend", Schedule: []time.Weekday{time.Monday}, - HashtagFormat: "QA-{{January 02 2006}}", + HashtagFormat: "QA_{{January 02 2006}}", }}, - want: "#QA-" + assertNextWeekdayDate(time.Monday, true).Format("January 02 2006"), + want: "#QA_" + strings.ReplaceAll(assertNextWeekdayDate(time.Monday, true).Format("January 02 2006"), " ", "_"), wantErr: false, }, { @@ -81,7 +81,7 @@ func TestPlugin_GenerateHashtag(t *testing.T) { Schedule: []time.Weekday{time.Monday}, HashtagFormat: "{{January 02 2006}}.vue", }}, - want: "#" + assertNextWeekdayDate(time.Monday, false).Format("January 02 2006") + ".vue", + want: "#" + strings.ReplaceAll(assertNextWeekdayDate(time.Monday, false).Format("January 02 2006"), " ", "_") + ".vue", wantErr: false, }, { @@ -93,7 +93,7 @@ func TestPlugin_GenerateHashtag(t *testing.T) { Schedule: []time.Weekday{time.Monday}, HashtagFormat: "React {{January 02 2006}} Born", }}, - want: "#React " + assertNextWeekdayDate(time.Monday, false).Format("January 02 2006") + " Born", + want: "#React " + strings.ReplaceAll(assertNextWeekdayDate(time.Monday, false).Format("January 02 2006"), " ", "_") + " Born", wantErr: false, }, { @@ -105,7 +105,7 @@ func TestPlugin_GenerateHashtag(t *testing.T) { Schedule: []time.Weekday{time.Monday}, HashtagFormat: "January 02 2006 {{January 02 2006}} January 02 2006", }}, - want: "#January 02 2006 " + assertNextWeekdayDate(time.Monday, false).Format("January 02 2006") + " January 02 2006", + want: "#January 02 2006 " + strings.ReplaceAll(assertNextWeekdayDate(time.Monday, false).Format("January 02 2006"), " ", "_") + " January 02 2006", wantErr: false, }, { @@ -117,7 +117,7 @@ func TestPlugin_GenerateHashtag(t *testing.T) { Schedule: []time.Weekday{time.Monday}, HashtagFormat: "{{ January 02 2006 }}", }}, - want: "#" + assertNextWeekdayDate(time.Monday, false).Format("January 02 2006"), + want: "#" + strings.ReplaceAll(assertNextWeekdayDate(time.Monday, false).Format("January 02 2006"), " ", "_"), wantErr: false, }, { @@ -129,7 +129,7 @@ func TestPlugin_GenerateHashtag(t *testing.T) { Schedule: []time.Weekday{time.Monday}, HashtagFormat: "{{ Mon Jan _2 }}", }}, - want: "#" + assertNextWeekdayDate(time.Monday, false).Format("Mon Jan _2"), + want: "#" + strings.ReplaceAll(assertNextWeekdayDate(time.Monday, false).Format("Mon Jan _2"), " ", "_"), wantErr: false, }, } @@ -176,7 +176,7 @@ func TestPlugin_GetMeeting(t *testing.T) { }, want: &Meeting{ Schedule: []time.Weekday{time.Thursday}, - HashtagFormat: "Short-{{ Jan02 }}", + HashtagFormat: "Short_{{ Jan 2 }}", ChannelID: "#short.name.channel", }, wantErr: false, @@ -190,7 +190,7 @@ func TestPlugin_GetMeeting(t *testing.T) { }, want: &Meeting{ Schedule: []time.Weekday{time.Thursday}, - HashtagFormat: "Very Long Chann-{{ Jan02 }}", + HashtagFormat: "Very Long Chann_{{ Jan 2 }}", ChannelID: "#long.name.channel", }, wantErr: false, diff --git a/webapp/src/components/meeting_settings/meeting_settings.jsx b/webapp/src/components/meeting_settings/meeting_settings.jsx index 47ee439..e518a94 100644 --- a/webapp/src/components/meeting_settings/meeting_settings.jsx +++ b/webapp/src/components/meeting_settings/meeting_settings.jsx @@ -17,8 +17,9 @@ export default class MeetingSettingsModal extends React.PureComponent { super(props); this.state = { - hashtag: '{{Jan02}}', + hashtagPrefix: 'Prefix', weekdays: [1], + dateFormat: '1-2', }; } @@ -28,9 +29,13 @@ export default class MeetingSettingsModal extends React.PureComponent { } if (this.props.meeting && this.props.meeting !== prevProps.meeting) { + const splitResult = this.props.meeting.hashtagFormat.split('{{');// we know, date Format is preceded by {{ + const hashtagPrefix = splitResult[0]; + const dateFormat = splitResult[1].substring(0, splitResult[1].length - 2); // remove trailing }} // eslint-disable-next-line react/no-did-update-set-state this.setState({ - hashtag: this.props.meeting.hashtagFormat, + hashtagPrefix, + dateFormat, weekdays: this.props.meeting.schedule || [], }); } @@ -38,10 +43,16 @@ export default class MeetingSettingsModal extends React.PureComponent { handleHashtagChange = (e) => { this.setState({ - hashtag: e.target.value, + hashtagPrefix: e.target.value, }); } + handleDateFormat = (event) => { + this.setState({ + dateFormat: event.target.value, + }); + }; + handleCheckboxChanged = (e) => { const changeday = Number(e.target.value); let changedWeekdays = Object.assign([], this.state.weekdays); @@ -62,7 +73,7 @@ export default class MeetingSettingsModal extends React.PureComponent { onSave = () => { this.props.saveMeetingSettings({ channelId: this.props.channelId, - hashtagFormat: this.state.hashtag, + hashtagFormat: `${this.state.hashtagPrefix}{{${this.state.dateFormat}}}`, schedule: this.state.weekdays.sort(), }); @@ -118,19 +129,50 @@ export default class MeetingSettingsModal extends React.PureComponent {
- - -

{'Hashtag is formatted using the '} - {'Go time package.'} - {' Embed a date by surrounding what January 2, 2006 would look like with double curly braces, i.e. {{Jan02}}'} +

+
+ + +
+
+ +
+ +
+
+ +

+

+ {'You may use underscore'}{'_'}{'.'} {'Other special characters including'} {'-'}{','} {'not allowed.'} +
+ {'Date would be appended to Hashtag Prefix, according to format chosen.'}

From 752d46845b68f14bd2416f6674511dd4015e2e06 Mon Sep 17 00:00:00 2001 From: Sanjay Date: Thu, 22 Jul 2021 12:34:58 +0530 Subject: [PATCH 2/5] Fixes #12 --- server/command.go | 102 +++- server/meeting.go | 18 +- server/meeting_test.go | 2 +- server/utils.go | 19 + webapp/src/actions/index.js | 36 +- .../edit_channel_subscription.tsx | 570 ++++++++++++++++++ webapp/src/index.js | 6 +- 7 files changed, 733 insertions(+), 20 deletions(-) create mode 100644 webapp/src/components/modals/channel_subscriptions/edit_channel_subscription.tsx diff --git a/server/command.go b/server/command.go index f53bb1a..622000f 100644 --- a/server/command.go +++ b/server/command.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "regexp" "strings" "time" @@ -49,6 +50,9 @@ func (p *Plugin) ExecuteCommand(c *plugin.Context, args *model.CommandArgs) (*mo case "queue": return p.executeCommandQueue(args), nil + case "requeue": + return p.executeCommandReQueue(args), nil + case "setting": return p.executeCommandSetting(args), nil @@ -69,7 +73,7 @@ func (p *Plugin) executeCommandList(args *model.CommandArgs) *model.CommandRespo weekday = int(parsedWeekday) } - hashtag, err := p.GenerateHashtag(args.ChannelId, nextWeek, weekday) + hashtag, err := p.GenerateHashtag(args.ChannelId, nextWeek, weekday, false, time.Now().Weekday()) if err != nil { return responsef("Error calculating hashtags") } @@ -147,25 +151,21 @@ func (p *Plugin) executeCommandQueue(args *model.CommandArgs) *model.CommandResp message = strings.Join(split[3:], " ") } - hashtag, error := p.GenerateHashtag(args.ChannelId, nextWeek, weekday) + hashtag, error := p.GenerateHashtag(args.ChannelId, nextWeek, weekday, false, time.Now().Weekday()) if error != nil { return responsef("Error calculating hashtags. Check the meeting settings for this channel.") } - searchResults, appErr := p.API.SearchPostsInTeamForUser(args.TeamId, args.UserId, model.SearchParameter{Terms: &hashtag}) - - if appErr != nil { - return responsef("Error calculating list number") + itemErr, numQueueItems := calculateQueItemNumber(args, p, hashtag) + if itemErr != nil { + return itemErr } - postList := *searchResults.PostList - numQueueItems := len(postList.Posts) - - _, appErr = p.API.CreatePost(&model.Post{ + _, appErr := p.API.CreatePost(&model.Post{ UserId: args.UserId, ChannelId: args.ChannelId, RootId: args.RootId, - Message: fmt.Sprintf("#### %v %v) %v", hashtag, numQueueItems+1, message), + Message: fmt.Sprintf("#### %v %v) %v", hashtag, numQueueItems, message), }) if appErr != nil { return responsef("Error creating post: %s", appErr.Message) @@ -174,6 +174,86 @@ func (p *Plugin) executeCommandQueue(args *model.CommandArgs) *model.CommandResp return &model.CommandResponse{} } +func calculateQueItemNumber(args *model.CommandArgs, p *Plugin, hashtag string) (*model.CommandResponse, int) { + searchResults, appErr := p.API.SearchPostsInTeamForUser(args.TeamId, args.UserId, model.SearchParameter{Terms: &hashtag}) + if appErr != nil { + return responsef("Error calculating list number"), 0 + } + postList := *searchResults.PostList + numQueueItems := len(postList.Posts) + return nil, numQueueItems + 1 +} + +func (p *Plugin) executeCommandReQueue(args *model.CommandArgs) *model.CommandResponse { + split := strings.Fields(args.Command) + + if len(split) <= 2 { + return responsef("Missing parameters for requeue command") + } + + meeting, err := p.GetMeeting(args.ChannelId) + if err != nil { + return responsef("Can't find the meeting") + } + + oldPostID := split[2] + postToBeReQueued, _ := p.API.GetPost(oldPostID) + var ( + prefix string + hashtagDateFormat string + ) + if matchGroups := meetingDateFormatRegex.FindStringSubmatch(meeting.HashtagFormat); len(matchGroups) == 4 { + prefix = matchGroups[1] + hashtagDateFormat = strings.TrimSpace(matchGroups[2]) + } else { + return responsef("Error 203") + } + + var ( + messageRegexFormat = regexp.MustCompile(fmt.Sprintf(`(?m)^#### #%s(?P.*) [0-9]+\) (?P.*)?$`, prefix)) + ) + + if matchGroups := messageRegexFormat.FindStringSubmatch(postToBeReQueued.Message); len(matchGroups) == 3 { + originalPostDate := strings.ReplaceAll(strings.TrimSpace(matchGroups[1]), "_", " ") // reverse what we do to make it a valid hashtag + originalPostMessage := strings.TrimSpace(matchGroups[2]) + + today := time.Now() + local, _ := time.LoadLocation("Local") + formattedDate, _ := time.ParseInLocation(hashtagDateFormat, originalPostDate, local) + if formattedDate.Year() == 0 { + thisYear := today.Year() + formattedDate = formattedDate.AddDate(thisYear, 0, 0) + } + + if today.Year() <= formattedDate.Year() && today.YearDay() < formattedDate.YearDay() { + return responsef("We don't support re-queuing future items, only available for present and past items.") + } + + hashtag, error := p.GenerateHashtag(args.ChannelId, false, -1, true, formattedDate.Weekday()) + if error != nil { + return responsef("Error calculating hashtags. Check the meeting settings for this channel.") + } + + itemErr, numQueueItems := calculateQueItemNumber(args, p, hashtag) + if itemErr != nil { + return itemErr + } + + _, appErr := p.API.UpdatePost(&model.Post{ + Id: oldPostID, + UserId: args.UserId, + ChannelId: args.ChannelId, + RootId: args.RootId, + Message: fmt.Sprintf("#### %v %v) %v", hashtag, numQueueItems, originalPostMessage), + }) + if appErr != nil { + return responsef("Error creating post: %s", appErr.Message) + } + return &model.CommandResponse{Text: fmt.Sprintf("Item has been Re-queued to %v", hashtag), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} + } + return responsef("Make sure, message is in required format!") +} + func (p *Plugin) executeCommandHelp(args *model.CommandArgs) *model.CommandResponse { return responsef(helpCommandText) } diff --git a/server/meeting.go b/server/meeting.go index eed7c10..127f3c0 100644 --- a/server/meeting.go +++ b/server/meeting.go @@ -63,7 +63,7 @@ func (p *Plugin) SaveMeeting(meeting *Meeting) error { } // GenerateHashtag returns a meeting hashtag -func (p *Plugin) GenerateHashtag(channelID string, nextWeek bool, weekday int) (string, error) { +func (p *Plugin) GenerateHashtag(channelID string, nextWeek bool, weekday int, requeue bool, assignedDay time.Weekday) (string, error) { meeting, err := p.GetMeeting(channelID) if err != nil { return "", err @@ -76,10 +76,20 @@ func (p *Plugin) GenerateHashtag(channelID string, nextWeek bool, weekday int) ( return "", err } } else { - // Get date for the list of days of the week - if meetingDate, err = nextWeekdayDateInWeek(meeting.Schedule, nextWeek); err != nil { - return "", err + // user didn't provide any specific date, Get date for the list of days of the week + if !requeue { + if meetingDate, err = nextWeekdayDateInWeek(meeting.Schedule, nextWeek); err != nil { + return "", err + } + } else { + if len(meeting.Schedule) == 1 && meeting.Schedule[0] == assignedDay { // if this day is the only day selected in settings + nextWeek = true + } + if meetingDate, err = nextWeekdayDateInWeekSkippingDay(meeting.Schedule, nextWeek, assignedDay); err != nil { + return "", err + } } + //---- requeue Logic } var hashtag string diff --git a/server/meeting_test.go b/server/meeting_test.go index a8b5b72..a64d5b6 100644 --- a/server/meeting_test.go +++ b/server/meeting_test.go @@ -138,7 +138,7 @@ func TestPlugin_GenerateHashtag(t *testing.T) { jsonMeeting, err := json.Marshal(tt.args.meeting) tAssert.Nil(err) api.On("KVGet", tt.args.meeting.ChannelID).Return(jsonMeeting, nil) - got, err := mPlugin.GenerateHashtag(tt.args.meeting.ChannelID, tt.args.nextWeek, -1) + got, err := mPlugin.GenerateHashtag(tt.args.meeting.ChannelID, tt.args.nextWeek, -1, false, time.Now().Weekday()) // last parameter doesn't matter unless requeue if (err != nil) != tt.wantErr { t.Errorf("GenerateHashtag() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/server/utils.go b/server/utils.go index 799a076..3a1c3e3 100644 --- a/server/utils.go +++ b/server/utils.go @@ -72,6 +72,25 @@ func nextWeekdayDateInWeek(meetingDays []time.Weekday, nextWeek bool) (*time.Tim return nextWeekdayDate(meetingDay, nextWeek) } +func nextWeekdayDateInWeekSkippingDay(meetingDays []time.Weekday, nextWeek bool, dayToSkip time.Weekday) (*time.Time, error) { + if len(meetingDays) == 0 { + return nil, errors.New("missing weekdays to calculate date") + } + + todayWeekday := time.Now().Weekday() + + // Find which meeting weekday to calculate the date for + meetingDay := meetingDays[0] + for _, day := range meetingDays { + if todayWeekday <= day && day != dayToSkip { + meetingDay = day + break + } + } + + return nextWeekdayDate(meetingDay, nextWeek) +} + // nextWeekdayDate calculates the date of the next given weekday // from today's date. // If nextWeek is true, it will be based on the next calendar week. diff --git a/webapp/src/actions/index.js b/webapp/src/actions/index.js index fa540f7..332577a 100644 --- a/webapp/src/actions/index.js +++ b/webapp/src/actions/index.js @@ -1,10 +1,10 @@ import {searchPostsWithParams} from 'mattermost-redux/actions/search'; - +import {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels'; import {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams'; import {getConfig} from 'mattermost-redux/selectors/entities/general'; +import {Client4} from 'mattermost-redux/client'; import Client from '../client'; - import ActionTypes from '../action_types'; export function fetchMeetingSettings(channelId = '') { @@ -80,4 +80,34 @@ export function performSearch(terms) { return dispatch(searchPostsWithParams(teamId, {terms, is_or_search: false, include_deleted_channels: viewArchivedChannels, page: 0, per_page: 20}, true)); }; -} \ No newline at end of file +} + +export function requeueItem(itemId) { + return async (dispatch, getState) => { + const command = `/agenda requeue ${itemId}`; + await clientExecuteCommand(dispatch, getState, command); + return {data: true}; + }; +} + +export async function clientExecuteCommand(dispatch, getState, command) { + let currentChannel = getCurrentChannel(getState()); + const currentTeamId = getCurrentTeamId(getState()); + + // Default to town square if there is no current channel (i.e., if Mattermost has not yet loaded) + if (!currentChannel) { + currentChannel = await Client4.getChannelByName(currentTeamId, 'town-square'); + } + + const args = { + channel_id: currentChannel?.id, + team_id: currentTeamId, + }; + + try { + //@ts-ignore Typing in mattermost-redux is wrong + return Client4.executeCommand(command, args); + } catch (error) { + return error; + } +} diff --git a/webapp/src/components/modals/channel_subscriptions/edit_channel_subscription.tsx b/webapp/src/components/modals/channel_subscriptions/edit_channel_subscription.tsx new file mode 100644 index 0000000..6771482 --- /dev/null +++ b/webapp/src/components/modals/channel_subscriptions/edit_channel_subscription.tsx @@ -0,0 +1,570 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React, {PureComponent} from 'react'; +import {Modal} from 'react-bootstrap'; + +import ReactSelectSetting from 'components/react_select_setting'; +import ConfirmModal from 'components/confirm_modal'; +import FormButton from 'components/form_button'; +import Input from 'components/input'; +import Loading from 'components/loading'; +import Validator from 'components/validator'; +import JiraInstanceAndProjectSelector from 'components/jira_instance_and_project_selector'; + +import {getBaseStyles, getModalStyles} from 'utils/styles'; +import { + getCustomFieldValuesForEvents, + getCustomFieldFiltersForProjects, + getConflictingFields, + generateJQLStringFromSubscriptionFilters, + getIssueTypes, +} from 'utils/jira_issue_metadata'; + +import {ChannelSubscription, ChannelSubscriptionFilters as ChannelSubscriptionFiltersModel, ReactSelectOption, FilterValue, IssueMetadata} from 'types/model'; + +import ChannelSubscriptionFilters from './channel_subscription_filters'; +import {SharedProps} from './shared_props'; + +const JiraEventOptions: ReactSelectOption[] = [ + {value: 'event_created', label: 'Issue Created'}, + {value: 'event_deleted', label: 'Issue Deleted'}, + {value: 'event_deleted_unresolved', label: 'Issue Deleted, Unresolved'}, + {value: 'event_updated_reopened', label: 'Issue Reopened'}, + {value: 'event_updated_resolved', label: 'Issue Resolved'}, + {value: 'event_created_comment', label: 'Comment Created'}, + {value: 'event_updated_comment', label: 'Comment Updated'}, + {value: 'event_deleted_comment', label: 'Comment Deleted'}, + {value: 'event_updated_any', label: 'Issue Updated: Any'}, + {value: 'event_updated_affects_version', label: 'Issue Updated: Affects Version'}, + {value: 'event_updated_assignee', label: 'Issue Updated: Assignee'}, + {value: 'event_updated_attachment', label: 'Issue Updated: Attachment'}, + {value: 'event_updated_description', label: 'Issue Updated: Description'}, + {value: 'event_updated_fix_version', label: 'Issue Updated: Fix Version'}, + {value: 'event_updated_issue_type', label: 'Issue Updated: Issue Type'}, + {value: 'event_updated_labels', label: 'Issue Updated: Labels'}, + {value: 'event_updated_priority', label: 'Issue Updated: Priority'}, + {value: 'event_updated_rank', label: 'Issue Updated: Rank'}, + {value: 'event_updated_reporter', label: 'Issue Updated: Reporter'}, + {value: 'event_updated_sprint', label: 'Issue Updated: Sprint'}, + {value: 'event_updated_status', label: 'Issue Updated: Status'}, + {value: 'event_updated_summary', label: 'Issue Updated: Summary'}, + {value: 'event_updated_components', label: 'Issue Updated: Components'}, +]; + +export type Props = SharedProps & { + finishEditSubscription: () => void; + selectedSubscription: ChannelSubscription | null; + creatingSubscription: boolean; +}; + +export type State = { + filters: ChannelSubscriptionFiltersModel; + instanceID: string; + fetchingIssueMetadata: boolean; + jiraIssueMetadata: IssueMetadata | null; + error: string | null; + getMetaDataErr: string | null; + submitting: boolean; + subscriptionName: string | null; + showConfirmModal: boolean; + conflictingError: string | null; +}; + +export default class EditChannelSubscription extends PureComponent { + private validator: Validator; + + constructor(props: Props) { + super(props); + + let filters: ChannelSubscriptionFiltersModel = { + events: [], + projects: [], + issue_types: [], + fields: [], + }; + + let subscriptionName = null; + if (props.selectedSubscription) { + filters = Object.assign({}, filters, props.selectedSubscription.filters); + subscriptionName = props.selectedSubscription.name; + } + + filters.fields = filters.fields || []; + + let instanceID = ''; + if (this.props.selectedSubscription) { + instanceID = this.props.selectedSubscription.instance_id; + } + + let fetchingIssueMetadata = false; + if (filters.projects.length && instanceID) { + fetchingIssueMetadata = true; + this.fetchIssueMetadata(filters.projects, instanceID); + } + + this.state = { + error: null, + getMetaDataErr: null, + submitting: false, + filters, + fetchingIssueMetadata, + jiraIssueMetadata: null, + subscriptionName, + showConfirmModal: false, + conflictingError: null, + instanceID, + }; + + this.validator = new Validator(); + } + + handleClose = (e?: React.FormEvent) => { + if (e && e.preventDefault) { + e.preventDefault(); + } + this.props.finishEditSubscription(); + }; + + handleNameChange = (id: string, value: string) => { + this.setState({subscriptionName: value}); + }; + + deleteChannelSubscription = () => { + if (this.props.selectedSubscription) { + this.props.deleteChannelSubscription(this.props.selectedSubscription).then((res) => { + if (res.error) { + this.setState({error: res.error.message}); + } else { + this.handleClose(); + } + }); + } + }; + + handleCancelDelete = () => { + this.setState({showConfirmModal: false}); + } + + handleConfirmDelete = () => { + this.setState({showConfirmModal: false}); + this.deleteChannelSubscription(); + } + + handleDeleteChannelSubscription = (): void => { + this.setState({showConfirmModal: true}); + }; + + handleSettingChange = (id: keyof ChannelSubscriptionFiltersModel, value: string[]) => { + let finalValue = value; + if (!finalValue) { + finalValue = []; + } else if (!Array.isArray(finalValue)) { + finalValue = [finalValue]; + } + const filters = {...this.state.filters}; + filters[id] = finalValue; + this.setState({filters}); + this.clearConflictingErrorMessage(); + }; + + clearConflictingErrorMessage = () => { + this.setState({conflictingError: null}); + } + + handleIssueChange = (id: keyof ChannelSubscriptionFiltersModel, value: string[] | null) => { + const finalValue = value || []; + const filters = {...this.state.filters, issue_types: finalValue}; + + let conflictingFields = null; + if (finalValue.length > this.state.filters.issue_types.length) { + const filterFields = getCustomFieldFiltersForProjects(this.state.jiraIssueMetadata, this.state.filters.projects); + conflictingFields = getConflictingFields( + filterFields, + finalValue, + this.state.jiraIssueMetadata + ); + } + + if (conflictingFields && conflictingFields.length) { + const selectedConflictingFields = conflictingFields.filter((f1) => { + return this.state.filters.fields.find((f2) => f1.field.key === f2.key); + }); + + if (selectedConflictingFields.length) { + const fieldsStr = selectedConflictingFields.map((cf) => cf.field.name).join(', '); + const conflictingIssueType = conflictingFields[0].issueTypes[0]; + + let errorStr = `Issue Type(s) "${conflictingIssueType.name}" does not have filter field(s): "${fieldsStr}". `; + errorStr += 'Please update the conflicting fields or create a separate subscription.'; + this.setState({conflictingError: errorStr}); + return; + } + } + + this.setState({filters, conflictingError: null}); + }; + + fetchIssueMetadata = (projectKeys: string[], instanceID: string) => { + if (!instanceID) { + this.setState({getMetaDataErr: 'No Jira instance is selected.'}); + } + + this.props.fetchJiraIssueMetadataForProjects(projectKeys, instanceID).then(({data, error}) => { + const jiraIssueMetadata = data as IssueMetadata; + const state = {fetchingIssueMetadata: false, jiraIssueMetadata} as State; + + if (error) { + state.getMetaDataErr = `The project ${projectKeys[0]} is unavailable. Please contact your system administrator.`; + } + + const filterFields = getCustomFieldFiltersForProjects(jiraIssueMetadata, this.state.filters.projects); + for (const v of this.state.filters.fields) { + if (!filterFields.find((f) => f.key === v.key)) { + state.error = 'A field in this subscription has been removed from Jira, so the subscription is invalid. When this form is submitted, the configured field will be removed from the subscription to make the subscription valid again.'; + } + } + + this.setState(state); + }); + }; + + handleJiraInstanceChange = (instanceID: string) => { + if (instanceID === this.state.instanceID) { + return; + } + + this.setState({instanceID, error: null}); + this.handleProjectChange(''); + } + + handleProjectChange = (projectID: string) => { + this.clearConflictingErrorMessage(); + + let projects: string[]; + if (projectID) { + projects = [projectID]; + } else { + projects = []; + } + + if (projects.length && this.state.filters.projects[0] === projects[0]) { + return; + } + + const filters = { + projects, + issue_types: [], + events: [], + fields: [], + }; + + let fetchingIssueMetadata = false; + + if (projects && projects.length) { + fetchingIssueMetadata = true; + this.fetchIssueMetadata(projects, this.state.instanceID); + } + + this.setState({ + fetchingIssueMetadata, + getMetaDataErr: null, + filters, + }); + }; + + handleFilterFieldChange = (fields: FilterValue[]) => { + this.setState({filters: {...this.state.filters, fields}}); + this.clearConflictingErrorMessage(); + }; + + handleCreate = (e?: React.FormEvent,isTemplate=false) => { + if (e && e.preventDefault) { + e.preventDefault(); + } + + if (!this.validator.validate()) { + return; + } + + const filterFields = getCustomFieldFiltersForProjects(this.state.jiraIssueMetadata, this.state.filters.projects); + const configuredFields = this.state.filters.fields.concat([]); + for (const v of this.state.filters.fields) { + if (!filterFields.find((f) => f.key === v.key)) { + configuredFields.splice(configuredFields.indexOf(v), 1); + } + } + + const filters = { + ...this.state.filters, + fields: configuredFields, + }; + + const subscription = { + channel_id: this.props.channel.id, + filters, + name: this.state.subscriptionName, + instance_id: this.state.instanceID, + } as ChannelSubscription; + + this.setState({submitting: true, error: null}); + + if(isTemplate){ + this.props.createChannelSubscriptionTemplate(subscription).then((created) => { + if (created.error) { + this.setState({error: created.error.message, submitting: false}); + return; + } + this.handleClose(e); + }); + }else { + console.log("created") + if (this.props.selectedSubscription) { + subscription.id = this.props.selectedSubscription.id; + this.props.editChannelSubscription(subscription).then((edited) => { + if (edited.error) { + this.setState({error: edited.error.message, submitting: false}); + return; + } + this.handleClose(e); + }); + } else { + this.props.createChannelSubscription(subscription).then((created) => { + if (created.error) { + this.setState({error: created.error.message, submitting: false}); + return; + } + this.handleClose(e); + }); + } + + } + }; + + handleCreateTemplate =(e?: React.FormEvent) =>{ + this.handleCreate(e,true) + } + + render(): JSX.Element { + const style = getModalStyles(this.props.theme); + + const issueTypes = getIssueTypes(this.state.jiraIssueMetadata, this.state.filters.projects[0]); + const issueOptions = issueTypes.map((it) => ({label: it.name, value: it.id})); + + const customFields = getCustomFieldValuesForEvents(this.state.jiraIssueMetadata, this.state.filters.projects); + const filterFields = getCustomFieldFiltersForProjects(this.state.jiraIssueMetadata, this.state.filters.projects); + + const eventOptions = JiraEventOptions.concat(customFields); + + let conflictingErrorComponent = null; + if (this.state.conflictingError) { + conflictingErrorComponent = ( +

+ {this.state.conflictingError} +

+ ); + } + + let component = null; + if (this.props.channel && this.props.channelSubscriptions) { + let innerComponent = null; + if (this.state.fetchingIssueMetadata) { + innerComponent = ; + } else if (this.state.filters.projects[0] && !this.state.getMetaDataErr && this.state.jiraIssueMetadata) { + innerComponent = ( + + this.state.filters.events.includes(option.value))} + addValidate={this.validator.addComponent} + removeValidate={this.validator.removeComponent} + /> + this.state.filters.issue_types.includes(option.value))} + addValidate={this.validator.addComponent} + removeValidate={this.validator.removeComponent} + /> + {conflictingErrorComponent} + +
+ +
+ {generateJQLStringFromSubscriptionFilters(this.state.jiraIssueMetadata, filterFields, this.state.filters)} +
+
+
+ ); + } + + component = ( + +
+ +
+
+ this.setState({error})} + + theme={this.props.theme} + addValidate={this.validator.addComponent} + removeValidate={this.validator.removeComponent} + /> + {innerComponent} +
+
+ ); + } else { + component = ; + } + + const {showConfirmModal} = this.state; + + let confirmDeleteMessage = 'Delete Subscription?'; + if (this.props.selectedSubscription && this.props.selectedSubscription.name) { + confirmDeleteMessage = `Delete Subscription "${this.props.selectedSubscription.name}"?`; + } + + let confirmComponent; + if (this.props.selectedSubscription) { + confirmComponent = ( + + ); + } + + let error = null; + if (this.state.error || this.state.getMetaDataErr) { + error = ( +

+ {this.state.error || this.state.getMetaDataErr} +

+ ); + } + + const enableSubmitButton = Boolean(this.state.filters.projects[0]); + const enableDeleteButton = Boolean(this.props.selectedSubscription); + + let saveSubscriptionButtonText = 'Save Subscription'; + let headerText = 'Edit Jira Subscription for '; + if (this.props.creatingSubscription) { + saveSubscriptionButtonText = 'Add Subscription'; + headerText = 'Add Jira Subscription in '; + } + + return ( +
+
+

{headerText}{this.props.channel.display_name}

+
+
+ {component} + {error} + {confirmComponent} +
+ + + + + + + + + +
+ ); + } +} + +const getStyle = (theme: any): any => ({ + modalBody: { + padding: '2em 0', + color: theme.centerChannelColor, + backgroundColor: theme.centerChannelBg, + }, + modalFooter: { + padding: '2rem 15px', + }, + descriptionArea: { + height: 'auto', + width: '100%', + color: '#000', + }, +}); diff --git a/webapp/src/index.js b/webapp/src/index.js index 3a14357..f22b434 100644 --- a/webapp/src/index.js +++ b/webapp/src/index.js @@ -1,5 +1,5 @@ -import {updateSearchTerms, updateSearchResultsTerms, updateRhsState, performSearch, openMeetingSettingsModal} from './actions'; +import {updateSearchTerms, updateSearchResultsTerms, updateRhsState, performSearch, openMeetingSettingsModal, requeueItem} from './actions'; import reducer from './reducer'; @@ -19,6 +19,10 @@ export default class Plugin { (channelId) => { store.dispatch(openMeetingSettingsModal(channelId)); }); + + registry.registerPostDropdownMenuAction('Re-queue', (params) => { + store.dispatch(requeueItem(params)); + }); } } From 1ae256a81b284c6ee4cbe6f724b6dffc0d2f7fb1 Mon Sep 17 00:00:00 2001 From: Sanjay Date: Thu, 22 Jul 2021 12:49:51 +0530 Subject: [PATCH 3/5] added missed static files --- README.md | 7 +++---- assets/settingsDialog.png | Bin 123462 -> 36897 bytes 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6c9f99b..bc9f0f2 100644 --- a/README.md +++ b/README.md @@ -27,10 +27,9 @@ The meeting settings for each channel can be configured in the Channel Header Dr Meeting settings include: -- Schedule Day: Day of the week when the meeting is scheduled. -- Hashtag Format: The format of the hashtag for the meeting date. The date format is based on [Go date and time formatting](https://yourbasic.org/golang/format-parse-string-time-date-example/#standard-time-and-date-formats). - The date format must be wrapped in double Braces ( {{ }} ). - A default is generated from the first 15 characters of the channel's name with the short name of the month and day (i.e. Dev-{{ Jan02 }}). +- Schedule Day: Day of the week when the meeting is being scheduled. +- Hashtag Format: The format of the hashtag for the meeting date. + A default hashtag is generated from the first 15 characters of the channel's name with the short name of the month and day (i.e. Dev_{{ Jan 2 }}). #### Slash Commands to manage the meeting agenda: diff --git a/assets/settingsDialog.png b/assets/settingsDialog.png index 4e4ce99227c701f3da193d733f6e204e745b8c58..79def86af2b0acb7df0b1d13dba64a8513a2bca4 100644 GIT binary patch literal 36897 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 literal 123462 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

kY`w=bKDYucr`wZk;qG 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 From e9447a8204319993687099028fd6a34bfadd44df Mon Sep 17 00:00:00 2001 From: Sanjay Date: Fri, 23 Jul 2021 11:26:40 +0530 Subject: [PATCH 4/5] Fixes #47 --- server/command.go | 143 +++++++++++++++++++++++++++++------------- server/plugin_test.go | 2 +- 2 files changed, 99 insertions(+), 46 deletions(-) diff --git a/server/command.go b/server/command.go index 622000f..423fc83 100644 --- a/server/command.go +++ b/server/command.go @@ -3,6 +3,7 @@ package main import ( "fmt" "regexp" + "sort" "strings" "time" @@ -17,6 +18,13 @@ const ( wsEventList = "list" ) +// ParsedMeetingMessage is meeting message after being parsed +type ParsedMeetingMessage struct { + date string + number string // TODO we don't need it right now + textMessage string +} + const helpCommandText = "###### Mattermost Agenda Plugin - Slash Command Help\n" + "The Agenda plugin lets you queue up meeting topics for channel discussion at a later time. When your meeting happens, you can click on the Hashtag to see all agenda items in the RHS. \n" + "To configure the agenda for this channel, click on the Channel Name in Mattermost to access the channel options menu and select `Agenda Settings`" + @@ -136,6 +144,11 @@ func (p *Plugin) executeCommandQueue(args *model.CommandArgs) *model.CommandResp return responsef("Missing parameters for queue command") } + meeting, err := p.GetMeeting(args.ChannelId) + if err != nil { + return responsef("Can't find the meeting") + } + nextWeek := false weekday := -1 message := strings.Join(split[2:], " ") @@ -156,7 +169,7 @@ func (p *Plugin) executeCommandQueue(args *model.CommandArgs) *model.CommandResp return responsef("Error calculating hashtags. Check the meeting settings for this channel.") } - itemErr, numQueueItems := calculateQueItemNumber(args, p, hashtag) + numQueueItems, itemErr := calculateQueItemNumberAndUpdateOldItems(meeting, args, p, hashtag) if itemErr != nil { return itemErr } @@ -174,14 +187,39 @@ func (p *Plugin) executeCommandQueue(args *model.CommandArgs) *model.CommandResp return &model.CommandResponse{} } -func calculateQueItemNumber(args *model.CommandArgs, p *Plugin, hashtag string) (*model.CommandResponse, int) { +func calculateQueItemNumberAndUpdateOldItems(meeting *Meeting, args *model.CommandArgs, p *Plugin, hashtag string) (int, *model.CommandResponse) { searchResults, appErr := p.API.SearchPostsInTeamForUser(args.TeamId, args.UserId, model.SearchParameter{Terms: &hashtag}) if appErr != nil { - return responsef("Error calculating list number"), 0 + return 0, responsef("Error calculating list number") + } + + counter := 1 + + var sortedPosts []*model.Post + // TODO we won't need to do this once we fix https://github.com/mattermost/mattermost-server/issues/11006 + for _, post := range searchResults.PostList.Posts { + sortedPosts = append(sortedPosts, post) + } + + sort.Slice(sortedPosts, func(i, j int) bool { + return sortedPosts[i].CreateAt < sortedPosts[j].CreateAt + }) + + for _, post := range sortedPosts { + _, parsedMessage, _ := parseMeetingPost(meeting, post) + _, findErr := p.API.UpdatePost(&model.Post{ + Id: post.Id, + UserId: args.UserId, + ChannelId: args.ChannelId, + RootId: args.RootId, + Message: fmt.Sprintf("#### %v %v) %v", hashtag, counter, parsedMessage.textMessage), + }) + counter++ + if findErr != nil { + return 0, responsef("Error updating post: %s", findErr.Message) + } } - postList := *searchResults.PostList - numQueueItems := len(postList.Posts) - return nil, numQueueItems + 1 + return counter, nil } func (p *Plugin) executeCommandReQueue(args *model.CommandArgs) *model.CommandResponse { @@ -198,6 +236,50 @@ func (p *Plugin) executeCommandReQueue(args *model.CommandArgs) *model.CommandRe oldPostID := split[2] postToBeReQueued, _ := p.API.GetPost(oldPostID) + hashtagDateFormat, parsedMeetingMessage, errors := parseMeetingPost(meeting, postToBeReQueued) + if errors != nil { + return errors + } + + originalPostDate := strings.ReplaceAll(strings.TrimSpace(parsedMeetingMessage.date), "_", " ") // reverse what we do to make it a valid hashtag + originalPostMessage := strings.TrimSpace(parsedMeetingMessage.textMessage) + + today := time.Now() + local, _ := time.LoadLocation("Local") + formattedDate, _ := time.ParseInLocation(hashtagDateFormat, originalPostDate, local) + if formattedDate.Year() == 0 { + thisYear := today.Year() + formattedDate = formattedDate.AddDate(thisYear, 0, 0) + } + + if today.Year() <= formattedDate.Year() && today.YearDay() < formattedDate.YearDay() { + return responsef("We don't support re-queuing future items, only available for present and past items.") + } + + hashtag, error := p.GenerateHashtag(args.ChannelId, false, -1, true, formattedDate.Weekday()) + if error != nil { + return responsef("Error calculating hashtags. Check the meeting settings for this channel.") + } + + numQueueItems, itemErr := calculateQueItemNumberAndUpdateOldItems(meeting, args, p, hashtag) + if itemErr != nil { + return itemErr + } + + _, appErr := p.API.UpdatePost(&model.Post{ + Id: oldPostID, + UserId: args.UserId, + ChannelId: args.ChannelId, + RootId: args.RootId, + Message: fmt.Sprintf("#### %v %v) %v", hashtag, numQueueItems, originalPostMessage), + }) + if appErr != nil { + return responsef("Error updating post: %s", appErr.Message) + } + return &model.CommandResponse{Text: fmt.Sprintf("Item has been Re-queued to %v", hashtag), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} +} + +func parseMeetingPost(meeting *Meeting, post *model.Post) (string, ParsedMeetingMessage, *model.CommandResponse) { var ( prefix string hashtagDateFormat string @@ -206,52 +288,23 @@ func (p *Plugin) executeCommandReQueue(args *model.CommandArgs) *model.CommandRe prefix = matchGroups[1] hashtagDateFormat = strings.TrimSpace(matchGroups[2]) } else { - return responsef("Error 203") + return "", ParsedMeetingMessage{}, responsef("Error 267") } var ( - messageRegexFormat = regexp.MustCompile(fmt.Sprintf(`(?m)^#### #%s(?P.*) [0-9]+\) (?P.*)?$`, prefix)) + messageRegexFormat = regexp.MustCompile(fmt.Sprintf(`(?m)^#### #%s(?P.*) ([0-9]+)\) (?P.*)?$`, prefix)) ) - if matchGroups := messageRegexFormat.FindStringSubmatch(postToBeReQueued.Message); len(matchGroups) == 3 { - originalPostDate := strings.ReplaceAll(strings.TrimSpace(matchGroups[1]), "_", " ") // reverse what we do to make it a valid hashtag - originalPostMessage := strings.TrimSpace(matchGroups[2]) - - today := time.Now() - local, _ := time.LoadLocation("Local") - formattedDate, _ := time.ParseInLocation(hashtagDateFormat, originalPostDate, local) - if formattedDate.Year() == 0 { - thisYear := today.Year() - formattedDate = formattedDate.AddDate(thisYear, 0, 0) - } - - if today.Year() <= formattedDate.Year() && today.YearDay() < formattedDate.YearDay() { - return responsef("We don't support re-queuing future items, only available for present and past items.") - } - - hashtag, error := p.GenerateHashtag(args.ChannelId, false, -1, true, formattedDate.Weekday()) - if error != nil { - return responsef("Error calculating hashtags. Check the meeting settings for this channel.") - } - - itemErr, numQueueItems := calculateQueItemNumber(args, p, hashtag) - if itemErr != nil { - return itemErr - } - - _, appErr := p.API.UpdatePost(&model.Post{ - Id: oldPostID, - UserId: args.UserId, - ChannelId: args.ChannelId, - RootId: args.RootId, - Message: fmt.Sprintf("#### %v %v) %v", hashtag, numQueueItems, originalPostMessage), - }) - if appErr != nil { - return responsef("Error creating post: %s", appErr.Message) + matchGroups := messageRegexFormat.FindStringSubmatch(post.Message) + if len(matchGroups) == 4 { + parsedMeetingMessage := ParsedMeetingMessage{ + date: matchGroups[1], + number: matchGroups[2], + textMessage: matchGroups[3], } - return &model.CommandResponse{Text: fmt.Sprintf("Item has been Re-queued to %v", hashtag), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} + return hashtagDateFormat, parsedMeetingMessage, nil } - return responsef("Make sure, message is in required format!") + return hashtagDateFormat, ParsedMeetingMessage{}, responsef("Please ensure correct message format!") } func (p *Plugin) executeCommandHelp(args *model.CommandArgs) *model.CommandResponse { diff --git a/server/plugin_test.go b/server/plugin_test.go index 6798bd0..a103a12 100644 --- a/server/plugin_test.go +++ b/server/plugin_test.go @@ -24,7 +24,7 @@ func TestServeHTTP(t *testing.T) { defaultMeeting := &Meeting{ ChannelID: "myChannelId", Schedule: []time.Weekday{time.Thursday}, - HashtagFormat: "Jan02", + HashtagFormat: "Jan-2", } jsonMeeting, err := json.Marshal(defaultMeeting) From 2b9783072826fe6bdd5725262e5c0c0250bd49cb Mon Sep 17 00:00:00 2001 From: sanjaydemansol <85980820+sanjaydemansol@users.noreply.github.com> Date: Fri, 30 Jul 2021 15:03:14 +0530 Subject: [PATCH 5/5] Delete webapp/src/components/modals/channel_subscriptions directory --- .../edit_channel_subscription.tsx | 570 ------------------ 1 file changed, 570 deletions(-) delete mode 100644 webapp/src/components/modals/channel_subscriptions/edit_channel_subscription.tsx diff --git a/webapp/src/components/modals/channel_subscriptions/edit_channel_subscription.tsx b/webapp/src/components/modals/channel_subscriptions/edit_channel_subscription.tsx deleted file mode 100644 index 6771482..0000000 --- a/webapp/src/components/modals/channel_subscriptions/edit_channel_subscription.tsx +++ /dev/null @@ -1,570 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -import React, {PureComponent} from 'react'; -import {Modal} from 'react-bootstrap'; - -import ReactSelectSetting from 'components/react_select_setting'; -import ConfirmModal from 'components/confirm_modal'; -import FormButton from 'components/form_button'; -import Input from 'components/input'; -import Loading from 'components/loading'; -import Validator from 'components/validator'; -import JiraInstanceAndProjectSelector from 'components/jira_instance_and_project_selector'; - -import {getBaseStyles, getModalStyles} from 'utils/styles'; -import { - getCustomFieldValuesForEvents, - getCustomFieldFiltersForProjects, - getConflictingFields, - generateJQLStringFromSubscriptionFilters, - getIssueTypes, -} from 'utils/jira_issue_metadata'; - -import {ChannelSubscription, ChannelSubscriptionFilters as ChannelSubscriptionFiltersModel, ReactSelectOption, FilterValue, IssueMetadata} from 'types/model'; - -import ChannelSubscriptionFilters from './channel_subscription_filters'; -import {SharedProps} from './shared_props'; - -const JiraEventOptions: ReactSelectOption[] = [ - {value: 'event_created', label: 'Issue Created'}, - {value: 'event_deleted', label: 'Issue Deleted'}, - {value: 'event_deleted_unresolved', label: 'Issue Deleted, Unresolved'}, - {value: 'event_updated_reopened', label: 'Issue Reopened'}, - {value: 'event_updated_resolved', label: 'Issue Resolved'}, - {value: 'event_created_comment', label: 'Comment Created'}, - {value: 'event_updated_comment', label: 'Comment Updated'}, - {value: 'event_deleted_comment', label: 'Comment Deleted'}, - {value: 'event_updated_any', label: 'Issue Updated: Any'}, - {value: 'event_updated_affects_version', label: 'Issue Updated: Affects Version'}, - {value: 'event_updated_assignee', label: 'Issue Updated: Assignee'}, - {value: 'event_updated_attachment', label: 'Issue Updated: Attachment'}, - {value: 'event_updated_description', label: 'Issue Updated: Description'}, - {value: 'event_updated_fix_version', label: 'Issue Updated: Fix Version'}, - {value: 'event_updated_issue_type', label: 'Issue Updated: Issue Type'}, - {value: 'event_updated_labels', label: 'Issue Updated: Labels'}, - {value: 'event_updated_priority', label: 'Issue Updated: Priority'}, - {value: 'event_updated_rank', label: 'Issue Updated: Rank'}, - {value: 'event_updated_reporter', label: 'Issue Updated: Reporter'}, - {value: 'event_updated_sprint', label: 'Issue Updated: Sprint'}, - {value: 'event_updated_status', label: 'Issue Updated: Status'}, - {value: 'event_updated_summary', label: 'Issue Updated: Summary'}, - {value: 'event_updated_components', label: 'Issue Updated: Components'}, -]; - -export type Props = SharedProps & { - finishEditSubscription: () => void; - selectedSubscription: ChannelSubscription | null; - creatingSubscription: boolean; -}; - -export type State = { - filters: ChannelSubscriptionFiltersModel; - instanceID: string; - fetchingIssueMetadata: boolean; - jiraIssueMetadata: IssueMetadata | null; - error: string | null; - getMetaDataErr: string | null; - submitting: boolean; - subscriptionName: string | null; - showConfirmModal: boolean; - conflictingError: string | null; -}; - -export default class EditChannelSubscription extends PureComponent { - private validator: Validator; - - constructor(props: Props) { - super(props); - - let filters: ChannelSubscriptionFiltersModel = { - events: [], - projects: [], - issue_types: [], - fields: [], - }; - - let subscriptionName = null; - if (props.selectedSubscription) { - filters = Object.assign({}, filters, props.selectedSubscription.filters); - subscriptionName = props.selectedSubscription.name; - } - - filters.fields = filters.fields || []; - - let instanceID = ''; - if (this.props.selectedSubscription) { - instanceID = this.props.selectedSubscription.instance_id; - } - - let fetchingIssueMetadata = false; - if (filters.projects.length && instanceID) { - fetchingIssueMetadata = true; - this.fetchIssueMetadata(filters.projects, instanceID); - } - - this.state = { - error: null, - getMetaDataErr: null, - submitting: false, - filters, - fetchingIssueMetadata, - jiraIssueMetadata: null, - subscriptionName, - showConfirmModal: false, - conflictingError: null, - instanceID, - }; - - this.validator = new Validator(); - } - - handleClose = (e?: React.FormEvent) => { - if (e && e.preventDefault) { - e.preventDefault(); - } - this.props.finishEditSubscription(); - }; - - handleNameChange = (id: string, value: string) => { - this.setState({subscriptionName: value}); - }; - - deleteChannelSubscription = () => { - if (this.props.selectedSubscription) { - this.props.deleteChannelSubscription(this.props.selectedSubscription).then((res) => { - if (res.error) { - this.setState({error: res.error.message}); - } else { - this.handleClose(); - } - }); - } - }; - - handleCancelDelete = () => { - this.setState({showConfirmModal: false}); - } - - handleConfirmDelete = () => { - this.setState({showConfirmModal: false}); - this.deleteChannelSubscription(); - } - - handleDeleteChannelSubscription = (): void => { - this.setState({showConfirmModal: true}); - }; - - handleSettingChange = (id: keyof ChannelSubscriptionFiltersModel, value: string[]) => { - let finalValue = value; - if (!finalValue) { - finalValue = []; - } else if (!Array.isArray(finalValue)) { - finalValue = [finalValue]; - } - const filters = {...this.state.filters}; - filters[id] = finalValue; - this.setState({filters}); - this.clearConflictingErrorMessage(); - }; - - clearConflictingErrorMessage = () => { - this.setState({conflictingError: null}); - } - - handleIssueChange = (id: keyof ChannelSubscriptionFiltersModel, value: string[] | null) => { - const finalValue = value || []; - const filters = {...this.state.filters, issue_types: finalValue}; - - let conflictingFields = null; - if (finalValue.length > this.state.filters.issue_types.length) { - const filterFields = getCustomFieldFiltersForProjects(this.state.jiraIssueMetadata, this.state.filters.projects); - conflictingFields = getConflictingFields( - filterFields, - finalValue, - this.state.jiraIssueMetadata - ); - } - - if (conflictingFields && conflictingFields.length) { - const selectedConflictingFields = conflictingFields.filter((f1) => { - return this.state.filters.fields.find((f2) => f1.field.key === f2.key); - }); - - if (selectedConflictingFields.length) { - const fieldsStr = selectedConflictingFields.map((cf) => cf.field.name).join(', '); - const conflictingIssueType = conflictingFields[0].issueTypes[0]; - - let errorStr = `Issue Type(s) "${conflictingIssueType.name}" does not have filter field(s): "${fieldsStr}". `; - errorStr += 'Please update the conflicting fields or create a separate subscription.'; - this.setState({conflictingError: errorStr}); - return; - } - } - - this.setState({filters, conflictingError: null}); - }; - - fetchIssueMetadata = (projectKeys: string[], instanceID: string) => { - if (!instanceID) { - this.setState({getMetaDataErr: 'No Jira instance is selected.'}); - } - - this.props.fetchJiraIssueMetadataForProjects(projectKeys, instanceID).then(({data, error}) => { - const jiraIssueMetadata = data as IssueMetadata; - const state = {fetchingIssueMetadata: false, jiraIssueMetadata} as State; - - if (error) { - state.getMetaDataErr = `The project ${projectKeys[0]} is unavailable. Please contact your system administrator.`; - } - - const filterFields = getCustomFieldFiltersForProjects(jiraIssueMetadata, this.state.filters.projects); - for (const v of this.state.filters.fields) { - if (!filterFields.find((f) => f.key === v.key)) { - state.error = 'A field in this subscription has been removed from Jira, so the subscription is invalid. When this form is submitted, the configured field will be removed from the subscription to make the subscription valid again.'; - } - } - - this.setState(state); - }); - }; - - handleJiraInstanceChange = (instanceID: string) => { - if (instanceID === this.state.instanceID) { - return; - } - - this.setState({instanceID, error: null}); - this.handleProjectChange(''); - } - - handleProjectChange = (projectID: string) => { - this.clearConflictingErrorMessage(); - - let projects: string[]; - if (projectID) { - projects = [projectID]; - } else { - projects = []; - } - - if (projects.length && this.state.filters.projects[0] === projects[0]) { - return; - } - - const filters = { - projects, - issue_types: [], - events: [], - fields: [], - }; - - let fetchingIssueMetadata = false; - - if (projects && projects.length) { - fetchingIssueMetadata = true; - this.fetchIssueMetadata(projects, this.state.instanceID); - } - - this.setState({ - fetchingIssueMetadata, - getMetaDataErr: null, - filters, - }); - }; - - handleFilterFieldChange = (fields: FilterValue[]) => { - this.setState({filters: {...this.state.filters, fields}}); - this.clearConflictingErrorMessage(); - }; - - handleCreate = (e?: React.FormEvent,isTemplate=false) => { - if (e && e.preventDefault) { - e.preventDefault(); - } - - if (!this.validator.validate()) { - return; - } - - const filterFields = getCustomFieldFiltersForProjects(this.state.jiraIssueMetadata, this.state.filters.projects); - const configuredFields = this.state.filters.fields.concat([]); - for (const v of this.state.filters.fields) { - if (!filterFields.find((f) => f.key === v.key)) { - configuredFields.splice(configuredFields.indexOf(v), 1); - } - } - - const filters = { - ...this.state.filters, - fields: configuredFields, - }; - - const subscription = { - channel_id: this.props.channel.id, - filters, - name: this.state.subscriptionName, - instance_id: this.state.instanceID, - } as ChannelSubscription; - - this.setState({submitting: true, error: null}); - - if(isTemplate){ - this.props.createChannelSubscriptionTemplate(subscription).then((created) => { - if (created.error) { - this.setState({error: created.error.message, submitting: false}); - return; - } - this.handleClose(e); - }); - }else { - console.log("created") - if (this.props.selectedSubscription) { - subscription.id = this.props.selectedSubscription.id; - this.props.editChannelSubscription(subscription).then((edited) => { - if (edited.error) { - this.setState({error: edited.error.message, submitting: false}); - return; - } - this.handleClose(e); - }); - } else { - this.props.createChannelSubscription(subscription).then((created) => { - if (created.error) { - this.setState({error: created.error.message, submitting: false}); - return; - } - this.handleClose(e); - }); - } - - } - }; - - handleCreateTemplate =(e?: React.FormEvent) =>{ - this.handleCreate(e,true) - } - - render(): JSX.Element { - const style = getModalStyles(this.props.theme); - - const issueTypes = getIssueTypes(this.state.jiraIssueMetadata, this.state.filters.projects[0]); - const issueOptions = issueTypes.map((it) => ({label: it.name, value: it.id})); - - const customFields = getCustomFieldValuesForEvents(this.state.jiraIssueMetadata, this.state.filters.projects); - const filterFields = getCustomFieldFiltersForProjects(this.state.jiraIssueMetadata, this.state.filters.projects); - - const eventOptions = JiraEventOptions.concat(customFields); - - let conflictingErrorComponent = null; - if (this.state.conflictingError) { - conflictingErrorComponent = ( -

- {this.state.conflictingError} -

- ); - } - - let component = null; - if (this.props.channel && this.props.channelSubscriptions) { - let innerComponent = null; - if (this.state.fetchingIssueMetadata) { - innerComponent = ; - } else if (this.state.filters.projects[0] && !this.state.getMetaDataErr && this.state.jiraIssueMetadata) { - innerComponent = ( - - this.state.filters.events.includes(option.value))} - addValidate={this.validator.addComponent} - removeValidate={this.validator.removeComponent} - /> - this.state.filters.issue_types.includes(option.value))} - addValidate={this.validator.addComponent} - removeValidate={this.validator.removeComponent} - /> - {conflictingErrorComponent} - -
- -
- {generateJQLStringFromSubscriptionFilters(this.state.jiraIssueMetadata, filterFields, this.state.filters)} -
-
-
- ); - } - - component = ( - -
- -
-
- this.setState({error})} - - theme={this.props.theme} - addValidate={this.validator.addComponent} - removeValidate={this.validator.removeComponent} - /> - {innerComponent} -
-
- ); - } else { - component = ; - } - - const {showConfirmModal} = this.state; - - let confirmDeleteMessage = 'Delete Subscription?'; - if (this.props.selectedSubscription && this.props.selectedSubscription.name) { - confirmDeleteMessage = `Delete Subscription "${this.props.selectedSubscription.name}"?`; - } - - let confirmComponent; - if (this.props.selectedSubscription) { - confirmComponent = ( - - ); - } - - let error = null; - if (this.state.error || this.state.getMetaDataErr) { - error = ( -

- {this.state.error || this.state.getMetaDataErr} -

- ); - } - - const enableSubmitButton = Boolean(this.state.filters.projects[0]); - const enableDeleteButton = Boolean(this.props.selectedSubscription); - - let saveSubscriptionButtonText = 'Save Subscription'; - let headerText = 'Edit Jira Subscription for '; - if (this.props.creatingSubscription) { - saveSubscriptionButtonText = 'Add Subscription'; - headerText = 'Add Jira Subscription in '; - } - - return ( -
-
-

{headerText}{this.props.channel.display_name}

-
-
- {component} - {error} - {confirmComponent} -
- - - - - - - - - -
- ); - } -} - -const getStyle = (theme: any): any => ({ - modalBody: { - padding: '2em 0', - color: theme.centerChannelColor, - backgroundColor: theme.centerChannelBg, - }, - modalFooter: { - padding: '2rem 15px', - }, - descriptionArea: { - height: 'auto', - width: '100%', - color: '#000', - }, -});