ponytail 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +8 -0
- data/Rakefile +2 -0
- data/app/assets/javascripts/ponytail/application.js +9 -0
- data/app/assets/javascripts/ponytail/collections/.keep +0 -0
- data/app/assets/javascripts/ponytail/models/column.js +43 -6
- data/app/assets/javascripts/ponytail/models/command.js +8 -0
- data/app/assets/javascripts/ponytail/models/create_table_command.js +16 -0
- data/app/assets/javascripts/ponytail/models/drop_table_command.js +8 -0
- data/app/assets/javascripts/ponytail/models/migration_file.js +36 -20
- data/app/assets/javascripts/ponytail/models/rename_table_command.js +9 -0
- data/app/assets/javascripts/ponytail/models/table.js +32 -28
- data/app/assets/javascripts/ponytail/ponytail.js +15 -0
- data/app/assets/javascripts/ponytail/routers/.keep +0 -0
- data/app/assets/javascripts/ponytail/views/column.js +36 -0
- data/app/assets/javascripts/ponytail/views/migration_file.js +24 -0
- data/app/assets/javascripts/ponytail/views/new_migrations.js +36 -0
- data/app/assets/javascripts/ponytail/views/table.js +61 -0
- data/app/assets/stylesheets/ponytail/application.css +2 -2
- data/app/controllers/ponytail/migrations_controller.rb +7 -0
- data/app/views/ponytail/migrations/_column.html.erb +22 -0
- data/app/views/ponytail/migrations/_column_view_template.html.erb +22 -0
- data/app/views/ponytail/migrations/_migration.html.erb +1 -0
- data/app/views/ponytail/migrations/_migration_file.html.erb +23 -0
- data/app/views/ponytail/migrations/_table.html.erb +7 -6
- data/app/views/ponytail/migrations/_table_view_template.html.erb +23 -0
- data/app/views/ponytail/migrations/index.html.erb +1 -2
- data/app/views/ponytail/migrations/new.html.erb +6 -26
- data/lib/ponytail/migration.rb +4 -0
- data/lib/ponytail/version.rb +1 -1
- data/lib/rails/mapper.rb +1 -1
- data/ponytail.gemspec +4 -2
- data/spec/controllers/migrations_controller_spec.rb +1 -1
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config/application.rb +23 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +2 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20131202142657_create_users.rb +10 -0
- data/spec/dummy/db/migrate/20131202142714_create_books.rb +10 -0
- data/spec/dummy/db/schema.rb +30 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/features/migrations/index_spec.rb +8 -0
- data/spec/javascripts/helpers/build_model.js +11 -0
- data/spec/javascripts/ponytail/models/column_spec.js +0 -12
- data/spec/javascripts/ponytail/models/command_spec.js +8 -0
- data/spec/javascripts/ponytail/models/create_command_spec.js +16 -0
- data/spec/javascripts/ponytail/models/migration_file_spec.js +12 -5
- data/spec/javascripts/ponytail/models/table_spec.js +15 -24
- data/spec/javascripts/support/jasmine.yml +6 -1
- data/spec/spec_helper.rb +6 -1
- data/vendor/assets/javascripts/backbone-min.js +2 -0
- data/vendor/assets/javascripts/jquery.min.js +6 -0
- data/vendor/assets/javascripts/jquery_ujs.js +394 -0
- data/vendor/assets/javascripts/underscore-min.js +6 -0
- metadata +140 -15
- data/app/assets/javascripts/ponytail/index.js +0 -20
- data/app/assets/javascripts/ponytail/models/create_table.js +0 -13
- data/app/assets/javascripts/ponytail/models/rename_table.js +0 -8
- data/app/assets/javascripts/ponytail/views/migration_file_view.js +0 -39
- data/app/assets/javascripts/ponytail/views/new_migration_view.js +0 -60
- data/app/assets/javascripts/ponytail/views/table_view.js +0 -68
- data/spec/javascripts/ponytail/views/migration_file_view_spec.js +0 -17
- data/spec/javascripts/ponytail/views/new_migration_view_spec.js +0 -17
- data/spec/javascripts/ponytail/views/table_view_spec.js +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94132f249283a8a919796eec99b3660e6d29d678
|
4
|
+
data.tar.gz: 3de14204fe0395266f3fe963894066fcfb4f12dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f77a34fa6dcf200a6f472760dfc9e033bfd0fef33ac528b0fd0e3614225fc4f333a4a194f10899231435c9d446c681586f4f2aef00383659f6ccd141344c4829
|
7
|
+
data.tar.gz: 1cf8b14224488416a548eafd44f5d1deb69840a94972c797a5c0dec000ebecf8d8994d95ab3f9e633261b1b221d645c9751a951f8d692f1a2450b13683a567c5
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -34,6 +34,14 @@ Comment out `config.active_record.migration_error` in `config/environments/devel
|
|
34
34
|
|
35
35
|
Visit `/rails/migrations` in your app.
|
36
36
|
|
37
|
+
## How to work dummy app
|
38
|
+
|
39
|
+
```bash
|
40
|
+
$ rake db:migrate:reset
|
41
|
+
$ cd spec/dummy
|
42
|
+
$ rails s
|
43
|
+
```
|
44
|
+
|
37
45
|
## Contributing
|
38
46
|
|
39
47
|
1. Fork it
|
data/Rakefile
CHANGED
@@ -3,6 +3,8 @@ require "rspec/core/rake_task"
|
|
3
3
|
load "jasmine/tasks/jasmine.rake"
|
4
4
|
ENV['JASMINE_SPEC_FORMAT'] = 'documentation'
|
5
5
|
|
6
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
7
|
+
load 'rails/tasks/engine.rake'
|
6
8
|
RSpec::Core::RakeTask.new(:spec)
|
7
9
|
|
8
10
|
task :default => [:spec, 'jasmine:ci']
|
@@ -1 +1,10 @@
|
|
1
|
+
//= require jquery.min
|
2
|
+
//= require jquery_ujs
|
3
|
+
//= require underscore-min
|
4
|
+
//= require backbone-min
|
5
|
+
//= require ./ponytail
|
6
|
+
//= require_tree ./models
|
7
|
+
//= require_tree ./collections
|
8
|
+
//= require_tree ./views
|
9
|
+
//= require_tree ./routers
|
1
10
|
//= require_tree .
|
File without changes
|
@@ -1,6 +1,43 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
Ponytail.Models.Column = Backbone.Model.extend({
|
2
|
+
defaults: {
|
3
|
+
type: "string",
|
4
|
+
name: "new_column",
|
5
|
+
isRemoved: false,
|
6
|
+
isAdded: false,
|
7
|
+
},
|
8
|
+
initialize: function (attrs, options) {
|
9
|
+
this.beforeType = attrs.type || "";
|
10
|
+
this.beforeName = attrs.name || "";
|
11
|
+
var func = _.bind(attrs.table.trigger, attrs.table, "change");
|
12
|
+
this.bind("change", func);
|
13
|
+
},
|
14
|
+
isRemoved: function() {
|
15
|
+
return this.get("isRemoved") === true;
|
16
|
+
},
|
17
|
+
isAdded: function() {
|
18
|
+
return this.get("isAdded") === true;
|
19
|
+
},
|
20
|
+
isRename: function() {
|
21
|
+
return this.beforeName != this.get("name");
|
22
|
+
},
|
23
|
+
isChangeType: function() {
|
24
|
+
return this.beforeType != this.get("type");
|
25
|
+
},
|
26
|
+
getCommands: function() {
|
27
|
+
var table = this.get("table");
|
28
|
+
if (this.isRemoved()) {
|
29
|
+
return [new Ponytail.Models.Command("remove_column", ":" + table.get("name"), ":" + this.beforeName)];
|
30
|
+
} else if (this.isAdded()) {
|
31
|
+
return [new Ponytail.Models.Command("add_column", ":" + table.get("name"), ":" + this.get("name"), ":" + this.get("type"))];
|
32
|
+
} else {
|
33
|
+
var commands = [];
|
34
|
+
if (this.isRename()) {
|
35
|
+
commands.push(new Ponytail.Models.Command("rename_column", ":" + table.get("name"), ":" + this.beforeName, ":" + this.get("name")));
|
36
|
+
}
|
37
|
+
if (this.isChangeType()) {
|
38
|
+
commands.push(new Ponytail.Models.Command("change_column", ":" + table.get("name"), ":" + this.get("name"), ":" + this.get("type")));
|
39
|
+
}
|
40
|
+
return commands;
|
41
|
+
}
|
42
|
+
},
|
43
|
+
});
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Ponytail.Models.CreateTableCommand = function(tableName, columns) {
|
2
|
+
this.tableName = tableName;
|
3
|
+
this.columns = columns;
|
4
|
+
};
|
5
|
+
Ponytail.Models.CreateTableCommand.prototype = {
|
6
|
+
toString: function() {
|
7
|
+
return [
|
8
|
+
"create_table :" + this.tableName + " do |t|",
|
9
|
+
this.columns.map(function(column) {
|
10
|
+
return "t." + column.get("type") + " :" + column.get("name");
|
11
|
+
}).join("\n").replace(/^/, " ").replace(/\n/g, "\n "),
|
12
|
+
" t.timestamps",
|
13
|
+
"end",
|
14
|
+
].join("\n");
|
15
|
+
}
|
16
|
+
};
|
@@ -1,24 +1,40 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
MigrationFile.prototype = {
|
6
|
-
setClassName: function(className) {
|
7
|
-
this.className = className;
|
1
|
+
Ponytail.Models.MigrationFile = Backbone.Model.extend({
|
2
|
+
defaults: {
|
3
|
+
className: "",
|
4
|
+
rawContent: "",
|
8
5
|
},
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
this.toStringOfCommands(),
|
13
|
-
" end",
|
14
|
-
"end"].join("\n");
|
6
|
+
initialize: function(attrs, options) {
|
7
|
+
this.tables = [];
|
8
|
+
this.bind("change:className", this.update);
|
15
9
|
},
|
16
|
-
|
17
|
-
this.
|
10
|
+
updateByTables: function(tables) {
|
11
|
+
this.tables = tables;
|
12
|
+
this.update();
|
18
13
|
},
|
19
|
-
|
20
|
-
|
14
|
+
update: function() {
|
15
|
+
var rawContent = [
|
16
|
+
"class " + this.get("className") + " < ActiveRecord::MigrationFile",
|
17
|
+
this.getContentOfClass(),
|
18
|
+
"end",
|
19
|
+
].join("\n");
|
20
|
+
this.set({"rawContent": rawContent});
|
21
|
+
},
|
22
|
+
getContentOfClass: function() {
|
23
|
+
return _.compact([
|
24
|
+
"def change",
|
25
|
+
this.getStringOfCommands(),
|
26
|
+
"end",
|
27
|
+
]).join("\n").replace(/^/, " ").replace(/\n/g, "\n ");
|
28
|
+
},
|
29
|
+
getStringOfCommands: function() {
|
30
|
+
var commands = this.getCommands();
|
31
|
+
return commands.map(function(command) {
|
21
32
|
return command.toString();
|
22
|
-
}).join("\n").replace(/^/, "
|
23
|
-
}
|
24
|
-
|
33
|
+
}).join("\n").replace(/^/, " ").replace(/\n/g, "\n ");
|
34
|
+
},
|
35
|
+
getCommands: function() {
|
36
|
+
return _.flatten(this.tables.map(function(table) {
|
37
|
+
return table.getCommands();
|
38
|
+
}));
|
39
|
+
},
|
40
|
+
});
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Ponytail.Models.RenameTableCommand = function(tableName, newName) {
|
2
|
+
this.tableName = tableName;
|
3
|
+
this.newName = newName;
|
4
|
+
};
|
5
|
+
Ponytail.Models.RenameTableCommand.prototype = {
|
6
|
+
toString: function() {
|
7
|
+
return new Ponytail.Models.Command("rename_table", ":" + this.tableName, ":" + this.newName);
|
8
|
+
}
|
9
|
+
};
|
@@ -1,40 +1,44 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
Ponytail.Models.Table = Backbone.Model.extend({
|
2
|
+
defaults: {
|
3
|
+
name: "new_table",
|
4
|
+
columns: [],
|
5
|
+
isDrop: false,
|
6
|
+
isCreated: false,
|
7
|
+
},
|
8
|
+
initialize: function (attrs, options) {
|
9
|
+
this.beforeName = attrs.name || "";
|
10
|
+
},
|
11
|
+
isCreated: function() {
|
12
|
+
return this.get("isCreated") === true;
|
12
13
|
},
|
13
14
|
isDrop: function() {
|
14
|
-
return this.
|
15
|
+
return this.get("isDrop") === true;
|
15
16
|
},
|
16
|
-
|
17
|
-
this.
|
17
|
+
isRename: function() {
|
18
|
+
return this.beforeName != this.get("name");
|
18
19
|
},
|
19
20
|
addColumn: function(column) {
|
20
|
-
this.columns
|
21
|
+
var columns = this.get("columns");
|
22
|
+
columns.push(column);
|
23
|
+
this.set({columns: columns});
|
24
|
+
this.trigger("change");
|
21
25
|
},
|
22
26
|
getCommands: function() {
|
23
|
-
if (this.
|
24
|
-
return [new Command("drop_table", ":" + this.beforeTableName)];
|
25
|
-
} else if (this.isDrop() && !this.isSaved()) {
|
27
|
+
if (this.isCreated() && this.isDrop()) {
|
26
28
|
return [];
|
27
|
-
} else if (this.
|
29
|
+
} else if (this.isCreated() && !this.isDrop()) {
|
30
|
+
return [new Ponytail.Models.CreateTableCommand(this.get("name"), this.get("columns"))];
|
31
|
+
} else if (!this.isCreated() && this.isDrop()) {
|
32
|
+
return [new Ponytail.Models.DropTableCommand(this.beforeName)];
|
33
|
+
} else {
|
28
34
|
var commands = [];
|
29
|
-
if (this.
|
30
|
-
commands.push(new
|
35
|
+
if (this.isRename()) {
|
36
|
+
commands.push(new Ponytail.Models.RenameTableCommand(this.beforeName, this.get("name")));
|
31
37
|
}
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
command.setTableName(this.tableName);
|
37
|
-
return [command];
|
38
|
+
this.get("columns").forEach(function(column) {
|
39
|
+
commands.push(column.getCommands());
|
40
|
+
});
|
41
|
+
return _.compact(_.flatten(commands));
|
38
42
|
}
|
39
43
|
}
|
40
|
-
};
|
44
|
+
});
|
@@ -0,0 +1,15 @@
|
|
1
|
+
window.Ponytail = {
|
2
|
+
Models: {},
|
3
|
+
Collections: {},
|
4
|
+
Views: {},
|
5
|
+
Routers: {},
|
6
|
+
};
|
7
|
+
|
8
|
+
function setupIndex() {
|
9
|
+
$(".pt_close_notice").click(function() {
|
10
|
+
$(".pt_notice").hide();
|
11
|
+
});
|
12
|
+
$(".pt_name, .pt_filename").click(function() {
|
13
|
+
$(".pt_raw_content", $(this).parent().parent()).toggle();
|
14
|
+
});
|
15
|
+
}
|
File without changes
|
@@ -0,0 +1,36 @@
|
|
1
|
+
Ponytail.Views.ColumnView = Backbone.View.extend({
|
2
|
+
className: 'pt_column',
|
3
|
+
events: {
|
4
|
+
"click .pt_column_type span": "toggleColumnType",
|
5
|
+
"blur .pt_column_type select": "changeColumnType",
|
6
|
+
"click .pt_column_name span": "toggleColumnName",
|
7
|
+
"keyup .pt_column_name input": function(e) { this.model.set({name: e.target.value}); },
|
8
|
+
"blur .pt_column_name input": "toggleColumnName",
|
9
|
+
},
|
10
|
+
initialize: function(options) {
|
11
|
+
_.bindAll(this, "render");
|
12
|
+
this.model.bind("change", this.render);
|
13
|
+
},
|
14
|
+
render: function() {
|
15
|
+
if (this.el.parentNode === null) {
|
16
|
+
$(this.el).html(_.template($("#column_view_template").html(), this.model.attributes));
|
17
|
+
} else {
|
18
|
+
$(this.el).find(".pt_column_type span").text(this.model.get("type"));
|
19
|
+
$(this.el).find(".pt_column_name span").text(this.model.get("name"));
|
20
|
+
}
|
21
|
+
$(this.el).find(".pt_column_type option[value='" + this.model.get("type") + "']").attr("selected", true);
|
22
|
+
return this;
|
23
|
+
},
|
24
|
+
toggleColumnType: function() {
|
25
|
+
$(this.el).find(".pt_column_type span").toggle();
|
26
|
+
$(this.el).find(".pt_column_type select").toggle();
|
27
|
+
},
|
28
|
+
changeColumnType: function(e) {
|
29
|
+
this.model.set({type: e.target.value});
|
30
|
+
this.toggleColumnType();
|
31
|
+
},
|
32
|
+
toggleColumnName: function() {
|
33
|
+
$(this.el).find(".pt_column_name span").toggle();
|
34
|
+
$(this.el).find(".pt_column_name input").toggle();
|
35
|
+
}
|
36
|
+
});
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Ponytail.Views.MigrationFileView = Backbone.View.extend({
|
2
|
+
events: {
|
3
|
+
"click .pt_edit_checkbox input": "toggleRawContent",
|
4
|
+
"click .pt_submit": function() { this.setRawContentEnabled(true); },
|
5
|
+
"keyup .pt_class_name input": function(e) { this.model.set({className: e.target.value}); },
|
6
|
+
},
|
7
|
+
initialize: function(options) {
|
8
|
+
_.bindAll(this, "render");
|
9
|
+
this.model.bind("change", this.render);
|
10
|
+
},
|
11
|
+
render: function() {
|
12
|
+
$(".pt_raw_content textarea").text(this.model.get("rawContent"));
|
13
|
+
},
|
14
|
+
toggleRawContent: function() {
|
15
|
+
this.setRawContentEnabled($(".pt_raw_content textarea").attr("disabled"));
|
16
|
+
},
|
17
|
+
setRawContentEnabled: function(enabled) {
|
18
|
+
if (enabled) {
|
19
|
+
$(".pt_raw_content textarea").removeAttr("disabled");
|
20
|
+
} else {
|
21
|
+
$(".pt_raw_content textarea").attr("disabled", "disabled");
|
22
|
+
}
|
23
|
+
},
|
24
|
+
});
|
@@ -0,0 +1,36 @@
|
|
1
|
+
Ponytail.Views.NewMigrationView = Backbone.View.extend({
|
2
|
+
events: {
|
3
|
+
"click .pt_new_table a": "appendTableView"
|
4
|
+
},
|
5
|
+
initialize: function() {
|
6
|
+
var tables = [];
|
7
|
+
$(".pt_table").each(function() {
|
8
|
+
var name = $(this).find(".pt_table_name span").text();
|
9
|
+
var m = new Ponytail.Models.Table({name: name});
|
10
|
+
tables.push(m);
|
11
|
+
new Ponytail.Views.TableView({el: $(this), model: m});
|
12
|
+
});
|
13
|
+
var migrationFile = new Ponytail.Models.MigrationFile();
|
14
|
+
new Ponytail.Views.MigrationFileView({el: $(".migration_file_view"), model: migrationFile});
|
15
|
+
tables.forEach(function(table) {
|
16
|
+
table.bind("change", function() {
|
17
|
+
migrationFile.updateByTables(tables);
|
18
|
+
});
|
19
|
+
});
|
20
|
+
this.tables = tables;
|
21
|
+
this.migrationFile = migrationFile;
|
22
|
+
},
|
23
|
+
appendTableView: function() {
|
24
|
+
var tables = this.tables;
|
25
|
+
var migrationFile = this.migrationFile;
|
26
|
+
var m = new Ponytail.Models.Table({isCreated: true});
|
27
|
+
tables.push(m);
|
28
|
+
m.bind("change", function() {
|
29
|
+
migrationFile.updateByTables(tables);
|
30
|
+
});
|
31
|
+
m.trigger("change");
|
32
|
+
var v = new Ponytail.Views.TableView({model: m});
|
33
|
+
$(".pt_new_table").before(v.render().el);
|
34
|
+
return false;
|
35
|
+
}
|
36
|
+
});
|
@@ -0,0 +1,61 @@
|
|
1
|
+
Ponytail.Views.TableView = Backbone.View.extend({
|
2
|
+
className: "pt_table",
|
3
|
+
events: {
|
4
|
+
"click .pt_table_name span": "toggleTableName",
|
5
|
+
"keyup .pt_table_name input": function(e) { this.model.set({name: e.target.value}); },
|
6
|
+
"blur .pt_table_name input": "toggleTableName",
|
7
|
+
"click .pt_drop_table": "dropTable",
|
8
|
+
"click .pt_restore_table": "restoreTable",
|
9
|
+
"click .pt_add_column": "addColumn",
|
10
|
+
},
|
11
|
+
initialize: function(options) {
|
12
|
+
_.bindAll(this, "render");
|
13
|
+
this.model.bind("change", this.render);
|
14
|
+
var table = this.model;
|
15
|
+
var columns = [];
|
16
|
+
_.each($(this.el).find(".pt_column"), function(elem) {
|
17
|
+
var type = $(elem).find(".pt_column_type span").text();
|
18
|
+
var name = $(elem).find(".pt_column_name span").text();
|
19
|
+
var m = new Ponytail.Models.Column({table: table, type: type, name: name});
|
20
|
+
new Ponytail.Views.ColumnView({el: elem, model: m}).render();
|
21
|
+
columns.push(m);
|
22
|
+
});
|
23
|
+
this.model.set({columns: columns}, {silent: true});
|
24
|
+
},
|
25
|
+
render: function() {
|
26
|
+
if (this.el.parentNode === null) {
|
27
|
+
$(this.el).html(_.template($("#table_view_template").html(), this.model.attributes));
|
28
|
+
} else {
|
29
|
+
$(this.el).find(".pt_table_name span").text(this.model.get("name"));
|
30
|
+
}
|
31
|
+
return this;
|
32
|
+
},
|
33
|
+
updateTableName: function() {
|
34
|
+
var v = $(this.el).find(".pt_table_name input")[0].value;
|
35
|
+
$(this.el).find(".pt_table_name span").text(v);
|
36
|
+
this.model.set({name: v});
|
37
|
+
},
|
38
|
+
toggleTableName: function() {
|
39
|
+
$(this.el).find(".pt_table_name span").toggle();
|
40
|
+
$(this.el).find(".pt_table_name input").toggle();
|
41
|
+
},
|
42
|
+
dropTable: function(e) {
|
43
|
+
this.model.set({isDrop: true});
|
44
|
+
$(this.el).find(".pt_drop_table").hide();
|
45
|
+
$(this.el).find(".pt_restore_table").show();
|
46
|
+
return false;
|
47
|
+
},
|
48
|
+
restoreTable: function(e) {
|
49
|
+
this.model.set({isDrop: false});
|
50
|
+
$(this.el).find(".pt_drop_table").show();
|
51
|
+
$(this.el).find(".pt_restore_table").hide();
|
52
|
+
return false;
|
53
|
+
},
|
54
|
+
addColumn: function(e) {
|
55
|
+
var column = new Ponytail.Models.Column({table: this.model, isAdded: true});
|
56
|
+
var view = new Ponytail.Views.ColumnView({model: column});
|
57
|
+
$(this.el).find(".pt_columns").append(view.render().el);
|
58
|
+
this.model.addColumn(column);
|
59
|
+
return false;
|
60
|
+
}
|
61
|
+
});
|
@@ -23,6 +23,13 @@ module Ponytail
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
def destroy
|
27
|
+
# TODO: fix params[:id]
|
28
|
+
@migration = Migration.all.select { |x| x.version == params[:id].to_i }.first
|
29
|
+
@migration.destroy
|
30
|
+
redirect_to :migrations, notice: 'Migration was successfully deleted.'
|
31
|
+
end
|
32
|
+
|
26
33
|
def migrate
|
27
34
|
if Migration.migrate
|
28
35
|
redirect_to :migrations, notice: 'Migrate was succeed.'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<div class="pt_column">
|
2
|
+
<div class="pt_column_type">
|
3
|
+
<span><%= column.type %></span>
|
4
|
+
<select style="display: none;">
|
5
|
+
<option value="string">string</option>
|
6
|
+
<option value="text">text</option>
|
7
|
+
<option value="integer">integer</option>
|
8
|
+
<option value="float">float</option>
|
9
|
+
<option value="decimal">decimal</option>
|
10
|
+
<option value="datetime">datetime</option>
|
11
|
+
<option value="timestamp">timestamp</option>
|
12
|
+
<option value="time">time</option>
|
13
|
+
<option value="date">date</option>
|
14
|
+
<option value="binary">binary</option>
|
15
|
+
<option value="boolean">boolean</option>
|
16
|
+
</select>
|
17
|
+
</div>
|
18
|
+
<div class="pt_column_name">
|
19
|
+
<span><%= column.name %></span>
|
20
|
+
<input type="text" value="<%= column.name %>" style="display: none;" />
|
21
|
+
</div>
|
22
|
+
</div>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<script type="text/template" id="column_view_template">
|
2
|
+
<div class="pt_column_type">
|
3
|
+
<span style="display: none;"><%%= type %></span>
|
4
|
+
<select>
|
5
|
+
<option value="string">string</option>
|
6
|
+
<option value="text">text</option>
|
7
|
+
<option value="integer">integer</option>
|
8
|
+
<option value="float">float</option>
|
9
|
+
<option value="decimal">decimal</option>
|
10
|
+
<option value="datetime">datetime</option>
|
11
|
+
<option value="timestamp">timestamp</option>
|
12
|
+
<option value="time">time</option>
|
13
|
+
<option value="date">date</option>
|
14
|
+
<option value="binary">binary</option>
|
15
|
+
<option value="boolean">boolean</option>
|
16
|
+
</select>
|
17
|
+
</div>
|
18
|
+
<div class="pt_column_name">
|
19
|
+
<span style="display: none;"><%%= name %></span>
|
20
|
+
<input type="text" value="<%%= name %>" />
|
21
|
+
</div>
|
22
|
+
</script>
|
@@ -4,6 +4,7 @@
|
|
4
4
|
<div class="pt_migration_header">
|
5
5
|
<span class="pt_name"><%= migration.name %></span>
|
6
6
|
<span class="pt_filename"><%= migration.filename %></span>
|
7
|
+
<%= link_to 'delete', migration_path(migration.version), method: :delete, confirm: 'Are you sure?' %>
|
7
8
|
</div>
|
8
9
|
<div class="pt_raw_content">
|
9
10
|
<pre><%= migration.raw_content %></pre>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<%= form_for migration, url: migrations_path do |f| %>
|
2
|
+
<%= render 'new_errors', migration: migration %>
|
3
|
+
|
4
|
+
<div class="pt_form_header">
|
5
|
+
<div class="pt_class_name">
|
6
|
+
<span>Class Name</span>
|
7
|
+
<%= f.text_field :name %>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<div class="pt_edit_checkbox">
|
11
|
+
<input type="checkbox" class="pt_checkbox" />
|
12
|
+
<span>edit</span>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div class="pt_raw_content">
|
17
|
+
<%= f.text_area :raw_content, size: '60x20', disabled: true %>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<%= f.submit 'Create File', class: :pt_submit %>
|
21
|
+
<% end %>
|
22
|
+
|
23
|
+
<%= button_to 'Cancel', migrations_path, method: :get %>
|
@@ -1,17 +1,18 @@
|
|
1
1
|
<div class="pt_table">
|
2
2
|
<div class="pt_table_name">
|
3
3
|
<span><%= table.name %></span>
|
4
|
-
<input type="text" />
|
4
|
+
<input type="text" value="<%= table.name %>" style="display: none;" />
|
5
5
|
</div>
|
6
6
|
<div>
|
7
7
|
<a href="#" class="pt_drop_table">drop</a>
|
8
|
+
<a href="#" class="pt_restore_table" style="display: none;">restore</a>
|
8
9
|
</div>
|
9
10
|
<div class="pt_columns">
|
10
11
|
<% table.columns.each do |column| %>
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
<%= render 'column', column: column %>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
15
|
+
<div>
|
16
|
+
<a href="#" class="pt_add_column">Add Column</a>
|
16
17
|
</div>
|
17
18
|
</div>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<script type="text/template" id="table_view_template">
|
2
|
+
<div class="pt_table">
|
3
|
+
<div class="pt_table_name">
|
4
|
+
<span style="display: none;"><%%= name %></span>
|
5
|
+
<input type="text" value="<%%= name %>" />
|
6
|
+
</div>
|
7
|
+
<div>
|
8
|
+
<a href="#" class="pt_drop_table">drop</a>
|
9
|
+
<a href="#" class="pt_restore_table" style="display: none;">restore</a>
|
10
|
+
</div>
|
11
|
+
<div class="pt_columns">
|
12
|
+
<%% _.each(columns, function(column) { %>
|
13
|
+
<div class="pt_column">
|
14
|
+
<div class="pt_column_type"><%%= column.type %></div>
|
15
|
+
<div class="pt_column_name"><%%= column.name %></div>
|
16
|
+
</div>
|
17
|
+
<%% }); %>
|
18
|
+
<div>
|
19
|
+
<a href="#" class="pt_add_column">Add Column</a>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
</script>
|